Как использовать SQLAlchemy Utils в модели SQLAlchemy - PullRequest
0 голосов
/ 05 января 2019

Я пытаюсь создать пользовательскую модель, которая использует 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=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`

Я пытался подробно объяснить используемому модулю, например this , и использовать «внутреннюю» реализацию, SQLAlchemy

Obs: если я вручную импортирую sqlalchemy_utils в /migrations/version/efae4166f832_.py и удаляю автоматически генерируемую длину 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)`

enter image description here

Объекты: движок MySQL

Я ожидаю, что когда я генерирую миграцию, она генерирует пользовательскую модель, которая использует UUID, реализованный из SQLAlchemy Utils в качестве первичного ключа

Ответы [ 3 ]

0 голосов
/ 01 февраля 2019

Спасибо, Марко, но я уже исправил это. Я поместил импорт 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 и в том же файле я установил render_item=render_item в функции run_migrations_online:

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

0 голосов
/ 25 февраля 2019

Добавить строку import sqlalchemy_utils во вновь созданный файл migrations/versions/{hash}_my_comment.py. Однако это решит проблему только на этом конкретном этапе миграции. Если вы ожидаете, что вы внесете множество изменений в столбцы, которые ссылаются на sqlalchemy_utils, вам, вероятно, следует сделать что-то более надежное, как совет Уолтера. Даже тогда, похоже, вам может понадобиться добавить код, чтобы правильно обрабатывать каждый тип столбца, который вы в конечном итоге используете.

NB. Несмотря на то, что в нескольких местах было предложено добавить строку импорта в файл script.py.mako, у меня это не получилось.

0 голосов
/ 30 января 2019

Вы просто должны добавить:

import sqlalchemy_utils

в ваш script.py.mako в папке миграций

...