如何创建单独的文件以生成不同 table 的数据库 Flask-SqlAlchemy?

How to create separate file to generate different table of database Flask-SqlAlchemy?

我使用 Flask-Restplus 和 SqlAlchemy 创建我的 table 和 Api.The 我面临的问题如下:

起初我有这个 user.py 里面有 2 table:

User.py

class User(db.Model):
    __tablename__ = "users_info"

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.Integer, unique=True, nullable=True)
    device = db.relationship('Device', backref='user')
    # .. some other field here


class Device(db.Model):
    __tablename__ = "user_device"

    device_id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    id = db.Column(db.Integer, db.ForeignKey(User.id))
    # .. some other field here

此时,我使用下面的这 2 个命令和 manage.py 创建数据库,没有问题。

python manage.py db migrate

python manage.py db upgrade

manage.py

import os
import unittest

from flask_migrate import Migrate, MigrateCommand
from flask_script import Manager
from app import blueprint

from app.main import create_app, db

app = create_app(os.getenv('My_App') or 'dev')
app.register_blueprint(blueprint)

app.app_context().push()

manager = Manager(app)

migrate = Migrate(app, db)

manager.add_command('db', MigrateCommand)


@manager.command
def run():
    app.run()


if __name__ == '__main__':
    manager.run()

现在我想创建另一个名为 product.py 的文件,这是一个新的 table 用于同一个数据库,如下所示:

Product.py

from .. import db
from .model.user import User


class Product(db.Model):
    __tablename__ = "product"

    product_id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    product_name = db.Column(db.String)
    # plan here what you want in this table
    user_id = db.Column(db.Integer, db.ForeignKey(User.user_id))

如您所见,Product class 与 UserforeignKey.

有关系

结果:

但是我使用上面相同的命令再次迁移,结果是这样的:

INFO  [alembic.runtime.migration] Context impl SQLiteImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
INFO  [alembic.env] No changes in schema detected.

似乎没有从我的新文件中检测到新的 table。

我的问题:

如何创建单独的文件来生成不同的 table 数据库?

我认为问题是模型没有被导入,这意味着 SQLAlchemy 和 Alembic 不知道它们。

这对某些人来说是违反直觉的,但是 SQLAlchemy 使用内省来找出定义了哪些模型,因此在许多情况下,解决问题的方法是只在主脚本中导入模型,即使您没有需要使用它们。导入它们将使它们对 SQLAlchemy 和 Alembic 可见,从那里一切都会正常工作。

在您的情况下,您只需要在 manage.py 中添加如下内容:

from model.user import User
from model.product import Product

如果由于循环依赖导致导入错误,您可能需要将导入移到所有其他导入的下方。如果您在同一个脚本中定义 db 实例,那么您希望这些导入位于定义数据库的行下方,因为显然需要先定义数据库。