如何在SQLAlchemy模型中使用SQLAlchemy Utils
我正在尝试创建一个使用UUID作为主键的用户模型:如何在SQLAlchemy模型中使用SQLAlchemy Utils,sqlalchemy,sqlalchemy-utils,Sqlalchemy,Sqlalchemy Utils,我正在尝试创建一个使用UUID作为主键的用户模型: from src.db import db # SQLAlchemy instance import sqlalchemy_utils import uuid class User(db.Model): __tablename__ = 'user' id = db.Column(sqlalchemy_utils.UUIDType(binary=True), primary_key=True, nullable=Fals
from src.db import db # SQLAlchemy instance
import sqlalchemy_utils
import uuid
class User(db.Model):
__tablename__ = 'user'
id = db.Column(sqlalchemy_utils.UUIDType(binary=True), primary_key=True, nullable=False)
但是,当我生成我收到的迁移时:
File "/home/pc/Downloads/project/auth/venv/lib/python3.6/site-packages/alembic/runtime/environment.py", line 836, in run_migrations
self.get_context().run_migrations(**kw)
File "/home/pc/Downloads/project/auth/venv/lib/python3.6/site-packages/alembic/runtime/migration.py", line 330, in run_migrations
step.migration_fn(**kw)
File "/home/pc/Downloads/project/auth/migrations/versions/efae4166f832_.py", line 22, in upgrade
sa.Column('id', sqlalchemy_utils.types.uuid.UUIDType(length=16), nullable=False),
NameError: name 'sqlalchemy_utils' is not defined`
我试图明确地告知我正在使用的模块,就像使用一个“内部”实现一样
Obs:如果我在/migrations/version/efae4166f832.py
中手动导入sqlalchemy_utils
,并删除自动生成的长度sa.Column('id',sqlalchemy_utils.types.uuid.UUIDType(length=16),nullable=False)
我使用generate.py
脚本生成迁移:
from src import create_app
from src.db import db
from flask_migrate import Migrate
# Models
from src.user.models.user import User
app = create_app()
migrate = Migrate(app, db)`
Obs:MySQL引擎
我希望在生成迁移时,它会生成一个用户模型,该模型使用从SQLAlchemy Utils实现的UUID作为主键,您只需添加:
import sqlalchemy_utils
到你的script.py.mako in migrations文件夹谢谢,Marco,但我已经修复了它。我已经将import
import sqlalchemy_utils
放在env.py和script.py.mako中,我还放了以下函数:
def render_item(type_, obj, autogen_context):
"""Apply custom rendering for selected items"""
if type_ == "type" and isinstance(obj, sqlalchemy_utils.types.uuid.UUIDType):
# Add import for this type
autogen_context.imports.add("import sqlalchemy_utils")
autogen_context.imports.add("import uuid")
return "sqlalchemy_utils.types.uuid.UUIDType(), default=uuid.uuid4"
# Default rendering for other objects
return False
在env.py中,在同一个文件中,我在函数run\u migrations\u online
中设置了render\u item=render\u item
:
context.configure(
...,
render_item=render_item,
...
)
我研究过自动完成这项工作,但我找不到任何可以帮助我的东西
行动顺序至关重要:
export FLASK\u APP=manage.py
flask db init
db迁移
flask数据库升级
将
import-sqlalchemy\u-utils
行添加到新创建的migrations/versions/{hash}\u my\u comment.py
文件中。但是,这只会解决迁移的特定步骤的问题。如果您希望对引用sqlalchemy\u utils
的列进行大量更改,那么您可能应该做一些更健壮的事情,比如Walter的建议。尽管如此,看起来您可能需要添加代码来正确处理最终使用的每种列类型
注意:尽管在多个地方看到了只将导入行添加到
script.py.mako
文件的建议,但这对我来说并不奏效。我做了一件非常类似的事情——如果我只将导入添加到script.py.mako文件中,则将该行添加到我的migrations/versions/9d34543545.py文件的顶部不足以解决问题。