Python 在炼金术中反映数据库

Python 在炼金术中反映数据库,python,flask-sqlalchemy,Python,Flask Sqlalchemy,我有一个现有的数据库,我想将其反映到我的flask应用程序中,这样我就可以与数据库交互。我可以反映数据库,但不确定如何在代码中声明表示表的类 我已经在stackoverflow和其他资源(包括SQLAlchemy和flask SQLAlchemy)周围进行了大量搜索,但对我来说,答案有点太高级了 下面的代码可以工作 from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__

我有一个现有的数据库,我想将其反映到我的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())

但是我不知道如何从上面的代码到类。例如,上面的print语句显示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))
这是print语句的输出

[
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)
]
[
Table('alembic_version',MetaData(bind=None),Column('version_num',VARCHAR(length=32),Table=,primary_key=True,nullable=False),schema=None),
表('followers',元数据(bind=None),列('followers_id',INTEGER(),ForeignKey('user.id'),表=),列('followers_id',INTEGER(),ForeignKey('user.id'),表=),架构=None),
Table('user',MetaData(bind=None),Column('id',INTEGER(),Table=,primary_key=True,nullable=False),Column('username',VARCHAR(length=64),Table=),Column('email',VARCHAR(length=120),Table=),Column('password_hash',VARCHAR length=128),Table=),Column('about_me',VARCHAR(length=140),Table=),Column('last__-seen',DATETIME()('last_message_read_time',DATETIME(),table=),schema=None),
Table('message',MetaData(bind=None),Column('id',INTEGER(),Table=,primary_key=True,nullable=False),Column('sender_id',INTEGER(),ForeignKey('user.id'),Table=),Column('body',VARCHAR(length=140),Table=),Column('timestamp',DATETIME(),Table=),schema=None),
Table('notification',MetaData(bind=None),Column('id',INTEGER(),Table=,primary_key=True,nullable=False),Column('name',VARCHAR(length=128),Table=),Column('user_id',INTEGER(),ForeignKey('user.id'),Table=),Column('timestamp',FLOAT(),Table=),Column('payload_json',TEXT(),Table=),schema=None),
表('post',元数据(bind=None),列('id',INTEGER(),Table=,primary_key=True,nullable=False),列('body',VARCHAR(length=140),表=),列('timestamp',DATETIME(),Table=),列('user_id',INTEGER(),ForeignKey('user.id'),Table=),列('language',VARCHAR length=5),Table=),schema=None),
Table('task',MetaData(bind=None),Column('id',VARCHAR(length=36),Table=,primary_key=True,nullable=False),Column('name',VARCHAR(length=128),Table=),Column('description',VARCHAR(length=128),Table=),Column('user_id',INTEGER(),ForeignKey('user.id'),Table=),Column('complete',BOOLEAN(),Table=),schema=无)
]

有人能指出我是如何声明与数据库中的表相对应的类的。

您可以创建一个.py文件来定义您的模型(例如-models.py) 并将数据库导入文件将path.to.file更改为实际位置

models.py

现在您可以导入用户并发布模型,如

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))

希望这能帮助您

Hi Ashish,是的,我知道这一点,但重点是我已经将实际数据库反映到SQLAlchemy中,因此用户和帖子应该自动可用,但我只是不知道如何绑定到它们。您上面键入的内容已经在db.get_tables_for_bind()中了但是我如何绑定呢?你能不能同时显示db.get_tables_for_bind()的输出.Hi Ashish,我已将print语句的输出添加到我的问题中。仔细分析显示,上面的表项是SQLAlchemy表对象。有一个名为sqlacodegen的包,它将此转换为python代码,该代码可以根据典型的flask SQLAlchemy编码实践表示模型,从而启用u1=用户用法我希望有一种方法可以在代码中动态声明这些类?
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))