首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在SQLAlchemy模型中使用SQLAlchemy Utils

如何在SQLAlchemy模型中使用SQLAlchemy Utils
EN

Stack Overflow用户
提问于 2019-01-05 19:27:50
回答 5查看 3.9K关注 0票数 6

我正在尝试创建一个使用UUID作为主键的用户模型:

代码语言:javascript
复制
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)

但是当我生成我收到的迁移时:

代码语言:javascript
复制
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`

我试着解释一下我使用的模块,比如,并使用SQLAlchemy的“内部”实现

Obs:如果我在sqlalchemy_utils中手动导入/migrations/version/efae4166f832_.py并删除自动生成的sa.Column('id', sqlalchemy_utils.types.uuid.UUIDType(length=16), nullable=False)的长度,那么它将工作很好

我使用generate.py脚本生成迁移:

代码语言:javascript
复制
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)`

MySQL引擎

我希望在生成迁移时,它会生成一个用户模型,该模型使用从SQLAlchemy Utils实现的UUID作为主键。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2019-02-01 01:46:50

谢谢,马可,但我已经修好了。我已经将导入import sqlalchemy_utils放入env.pyenv.py中,我还添加了以下函数:

代码语言:javascript
复制
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_migrations_online中设置了render_item=render_item

代码语言:javascript
复制
context.configure(
    ...,
    render_item=render_item,
    ...
)

我研究了自动完成这个任务,但是我找不到任何能帮助我的东西。

行动的顺序很重要:

  1. export FLASK_APP=manage.py
  2. flask db init
  3. 做上面的教程
  4. flask db migrate
  5. flask db upgrade
票数 2
EN

Stack Overflow用户

发布于 2019-01-30 12:35:04

你只需加上:

代码语言:javascript
复制
import sqlalchemy_utils

到迁移文件夹中的script.py.mako

票数 13
EN

Stack Overflow用户

发布于 2022-07-01 16:06:41

背景

如果不必使用import sqlalchemy_utils语句手动编辑每个迁移文件,这将是非常理想的。

查看Alembic 文档script.py.mako是“一个用于生成新迁移脚本的Mako模板文件”。因此,您需要重新生成您的迁移文件,因为Mako已经导入sqlalchemy_utils作为迁移文件生成的一部分。

修复

如果可能的话,删除旧的迁移(它们可能已经损坏),并像这样将import sqlalchemy_utils添加到script.py.mako文件中:

代码语言:javascript
复制
from alembic import op
import sqlalchemy as sa
import sqlalchemy_utils #<-- line you add
${imports if imports else ""}

然后重新运行你的大脑迁移:

alembic revision --autogenerate -m "create initial tables"

当您查看迁移文件时,应该会看到已经通过mako脚本导入的sqlalchemy_utils

希望这能帮上忙。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54055469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档