Отражение базы данных в Flask SQLAlchemy - PullRequest
0 голосов
/ 24 июня 2019

У меня есть существующая база данных, которую я хочу отразить в своем приложении для колб, чтобы я мог взаимодействовать с базой данных.Я могу отразить базу данных, но тогда я не уверен, как объявить классы, представляющие таблицы в моем коде.

Я много раз искал 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)
]

Может кто-то указать, как я объявляю классысоответствует таблицам в базе данных.

1 Ответ

0 голосов
/ 24 июня 2019

Вы можете создать файл .py для определения вашей модели (например, models.py) и импортировать базу данных в файл изменить путь .to.file на фактическое местоположение

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

Теперь вы можете импортировать модель пользователя и поста, например,

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

Надеюсь, это может помочь вам

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...