4

モデルに一意の属性を追加しましたuid:MyModel

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
4

2 に答える 2

0

作成した移行スクリプトは、すべての行に同じ uid を設定し、generate_uid()関数が 1 回呼び出され、その結果がすべての行に追加されます。そのため、インデックスが作成されると、重複キー エラーが発生します。

uid とデータベースによっては、すべての行に一意の ID を作成する単一の SQL ステートメントを記述できるかもしれませんが、安全な方法は、ループを実行して各行を個別に更新することです。

于 2016-07-21T23:48:23.410 に答える