[英]Reflecting a database in Flask SQLAlchemy
我有一個現有的數據庫,我想將其反映到我的 Flask 應用程序中,以便我可以與數據庫進行交互。 我可以反映數據庫,但我不確定如何在我的代碼中聲明表示表的類。
我已經對 stackoverflow 和其他來源(包括 SQLAlchemy 和 flask-SQLAlchemy)進行了大量搜索,但答案對我來說有點高級。
以下代碼有效。
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///.../app.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
db.reflect(bind='__all__', app=None)
model = db.Model
meta = db.metadata
engine = db.engine
print(db.get_tables_for_bind())
但我不確定如何從上面的代碼到類。 例如,上面的打印語句顯示存在表 User 和 Post。 但是,如果我附加以下代碼,它會顯示 User 和 Post 未定義。
u1 = User(username='john', email='john@example.com')
p1 = Post(body="post from john",author=u1,timestamp=now + timedelta(seconds=1))
這是打印語句的輸出。
[
Table('alembic_version', MetaData(bind=None), Column('version_num', VARCHAR(length=32), table=<alembic_version>, primary_key=True, nullable=False), schema=None),
Table('followers', MetaData(bind=None), Column('follower_id', INTEGER(), ForeignKey('user.id'), table=<followers>), Column('followed_id', INTEGER(), ForeignKey('user.id'), table=<followers>), schema=None),
Table('user', MetaData(bind=None), Column('id', INTEGER(), table=<user>, primary_key=True, nullable=False), Column('username', VARCHAR(length=64), table=<user>), Column('email', VARCHAR(length=120), table=<user>), Column('password_hash', VARCHAR(length=128), table=<user>), Column('about_me', VARCHAR(length=140), table=<user>), Column('last_seen', DATETIME(), table=<user>), Column('last_message_read_time', DATETIME(), table=<user>), schema=None),
Table('message', MetaData(bind=None), Column('id', INTEGER(), table=<message>, primary_key=True, nullable=False), Column('sender_id', INTEGER(), ForeignKey('user.id'), table=<message>), Column('recipient_id', INTEGER(), ForeignKey('user.id'), table=<message>), Column('body', VARCHAR(length=140), table=<message>), Column('timestamp', DATETIME(), table=<message>), schema=None),
Table('notification', MetaData(bind=None), Column('id', INTEGER(), table=<notification>, primary_key=True, nullable=False), Column('name', VARCHAR(length=128), table=<notification>), Column('user_id', INTEGER(), ForeignKey('user.id'), table=<notification>), Column('timestamp', FLOAT(), table=<notification>), Column('payload_json', TEXT(), table=<notification>), schema=None),
Table('post', MetaData(bind=None), Column('id', INTEGER(), table=<post>, primary_key=True, nullable=False), Column('body', VARCHAR(length=140), table=<post>), Column('timestamp', DATETIME(), table=<post>), Column('user_id', INTEGER(), ForeignKey('user.id'), table=<post>), Column('language', VARCHAR(length=5), table=<post>), schema=None),
Table('task', MetaData(bind=None), Column('id', VARCHAR(length=36), table=<task>, primary_key=True, nullable=False), Column('name', VARCHAR(length=128), table=<task>), Column('description', VARCHAR(length=128), table=<task>), Column('user_id', INTEGER(), ForeignKey('user.id'), table=<task>), Column('complete', BOOLEAN(), table=<task>), schema=None)
]
有人可以指出我如何聲明與數據庫中的表相對應的類。
您可以制作一個.py文件來定義您的模型(例如-models.py)並將數據庫導入到文件中,將 path.to.file 更改為實際位置
模型.py
from sqlalchemy import Column
from sqlalchemy import Unicode
from sqlalchemy import DateTime
from sqlalchemy import ForeignKey
from sqlalchemy import Integer
from path.to.file import db
class User(db.Model):
__tablename__ = 'User'
rid = Column(Integer, primary_key=True)
username = Column(Unicode(100), nullable=False, unique=True)
email = Column(Unicode(50), nullable=False, unique=True)
class Post(db.Model):
__tablename__ = 'Post'
rid = Column(Integer, primary_key=True)
author = Column(Integer, ForeignKey('User.rid', ondelete='cascade'), nullable=False)
body = Column(Unicode(500), nullable=False, unique=True)
timestamp = Column(DateTime(timezone=True))
現在您可以導入 User 和 Post 模型,例如
from ./models import User
from ./models import Post
u1 = User(username='john', email='john@example.com')
p1 = Post(body="post from john",author=u1,timestamp=now + timedelta(seconds=1))
希望,這可以幫助你
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.