簡體   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