flask - 如何为 Alembic 迁移的每一行设置唯一值

标签 flask sqlalchemy alembic flask-migrate sqlalchemy-migrate

我添加了一个独特的属性 uidMyModel模型:

class MyModel(db.Model):
...
    uid = db.Column(db.String(50), nullable=False)
...
    __table_args__ = (UniqueConstraint('uid', name='unique_uid'),)

我有一个迁移:
def upgrade():
    op.add_column('mymodel', sa.Column('uid', sa.String(length=50), nullable=True))

    mymodel = table('mymodel', column('uid'))
    op.execute(mymodel.update().values(uid=generate_uid()))
    op.create_unique_constraint('unique_uid', 'mymodel', ['uid'])

    op.alter_column(
        table_name='mymodel',
        column_name='uid',
        nullable=False
    )

运行中 db upgrade我有一个错误:
...
psycopg2.IntegrityError: could not create unique index "unique_uid"
DETAIL:  Key (uid)=(c92U6txA2) is duplicated.

如何为 op.execute(mymodel.update().values(uid=generate_uid())) 上的每一行设置唯一值?
$ pip freeze
alembic==0.8.6
Flask==0.10.1
Flask-Fixtures==0.3.3
Flask-Login==0.3.2
Flask-Migrate==1.8.0
Flask-Script==2.0.5
Flask-SQLAlchemy==2.1
itsdangerous==0.24
Jinja2==2.8
Mako==1.0.4
MarkupSafe==0.23
psycopg2==2.6.1
python-editor==1.0
requests==2.10.0
SQLAlchemy==1.0.13
Werkzeug==0.11.9

最佳答案

可能的解决方案:

from sqlalchemy.orm import Session
from alembic import op
import sqlalchemy as sa

def upgrade():
    conn = op.get_bind()
    session = Session(bind=conn)

    op.add_column('mymodel', sa.Column('uid', sa.String(length=50), nullable=True))

    for item in session.query(MyModel).filter_by(uid=None):
        item.uid = generate_uid()
    session.commit()

    op.create_unique_constraint('unique_uid', 'mymodel', ['uid'])

    op.alter_column(
        table_name='mymodel',
        column_name='uid',
        nullable=False
    )

关于flask - 如何为 Alembic 迁移的每一行设置唯一值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38501140/

相关文章:

python - Wtforms-炼金术场序

python - Alembic:从脚本内的模式比较获取 SQL 输出

postgresql - 如何让 alembic 在 after_create 上发出自定义 DDL?

Python Flask 应用程序抛出 RuntimeError : working outside of request context

python - 尽管从相同的requirements.txt安装依赖项,相同的代码在venv中不起作用

python - Flask 中的 import 和 extends 有什么区别?

flask - 无法从 Kubernetes Engine 连接到 CloudSQL(无法连接到 'localhost' 上的 MySQL 服务器)

python - alembic 是否关心其迁移文件的名称?

python - 如何在 Jinja 循环中传递多个参数?

python - 从 Docker 容器中运行的 Flask 应用程序下载文件