【问题标题】:SQLAlchemy There are no primary or candidate keys that match the referencing column list in the foreign keySQLAlchemy 没有与外键中的引用列列表匹配的主键或候选键
【发布时间】:2021-07-25 18:12:15
【问题描述】:

我有一个更新的模型

在用户之前

class Users(db.Model):
    username = db.Column(db.String(64), index=True, unique=True)
    user_created_timestamp = db.Column(db.DateTime)
    email = db.Column(db.String(120), index=True, unique=True)
    password_hash = db.Column(db.String(128))
    user_uuid = db.Column(UNIQUEIDENTIFIER, primary_key=True)
    scores = db.relationship("Scores", backref="owner", lazy="dynamic")

在用户之后

class Users(db.Model):
    uuid = db.Column(UNIQUEIDENTIFIER, primary_key=True)
    email = db.Column(db.String(120), index=True, unique=True)
    user_created_timestamp = db.Column(db.DateTime)
    password_hash = db.Column(db.String(128))
    scores = db.relationship("Scores", backref="owner", lazy="dynamic")

所以我想删除用户名并将 user_uuid 重命名为 uuid。

我生成了一个迁移文件并修复了一些删除用户名的错误,但我无法将 user_uuid 重命名为 uuid。

这里是迁移脚本

    op.add_column('users', sa.Column('uuid', mssql.UNIQUEIDENTIFIER(), nullable=False))
    sa.PrimaryKeyConstraint("uuid")
    op.create_foreign_key(None, 'scores', 'users', ['user_uuid'], ['uuid'])
    op.drop_constraint('FK__scores__user_uui__17F790F9', 'scores', type_='foreignkey')
    op.drop_index(op.f("ix_users_username"), table_name="users")
    op.drop_column('users', 'username')
    op.drop_constraint('pk_users', 'users', type_='primary')
    op.drop_column('users', 'user_uuid')

这是错误

sqlalchemy.exc.ProgrammingError: (pyodbc.ProgrammingError) ('42000', "[42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]引用的表中没有主键或候选键'与外键“FK__scores__user_uui__2BFE89A6”中的引用列列表匹配的用户。(1776) (SQLExecDirectW)

我了解错误的含义,但在我的一生中,即使对原始迁移进行了多次更改,我也无法更新此错误。有什么明显的我做错了吗?

【问题讨论】:

  • 我至少已经确定问题出在 create_foreign_key 行。
  • 如果这实际上是关于 Alembic 的问题,那么它应该被标记为这样。
  • @GordThompson 好的。我标记了它。很高兴知道未来。

标签: sql-server python-3.x sqlalchemy azure-sql-database alembic


【解决方案1】:

好的,我想通了。线

sa.PrimaryKeyConstraint("uuid")

创建约束,但实际上并不创建主键。我还需要添加

op.create_primary_key("pk_users", "users", ["uuid"])

命令的最终顺序是这样的

    op.add_column('users', sa.Column('uuid', mssql.UNIQUEIDENTIFIER(), nullable=False))
    op.drop_constraint('FK__scores__user_uui__17F790F9', 'scores', type_='foreignkey')
    op.drop_index(op.f("ix_users_username"), table_name="users")
    op.drop_column('users', 'username')
    op.drop_constraint('pk_users', 'users', type_='primary')
    op.drop_column('users', 'user_uuid')
    sa.PrimaryKeyConstraint("uuid")
    op.create_primary_key("pk_users", "users", ["uuid"])
    op.create_foreign_key(None, 'scores', 'users', ['user_uuid'], ['uuid'])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多