繁体   English   中英

在 Flask SQLAlchemy 中反映数据库

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM