如何创建单独的文件以生成不同 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 与 User
和 foreignKey
.
有关系
结果:
但是我使用上面相同的命令再次迁移,结果是这样的:
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
实例,那么您希望这些导入位于定义数据库的行下方,因为显然需要先定义数据库。
我使用 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 与 User
和 foreignKey
.
结果:
但是我使用上面相同的命令再次迁移,结果是这样的:
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
实例,那么您希望这些导入位于定义数据库的行下方,因为显然需要先定义数据库。