Python SQLAlchemy表反射-删除重复的源列引用
我试图通过执行以下命令来使用Python SQLAlchemy表反射-删除重复的源列引用,python,sqlalchemy,Python,Sqlalchemy,我试图通过执行以下命令来使用sqlalchemy反映一个表: PilotCycle = Table('PilotCycle', pr_meta, schema='dbo', autoload=True, autoload_with=pr_engine) 但是,我收到一个错误:“ArgumentError:不支持具有重复源列引用的ForeignKeyConstraint。” 我想我通过检查表的外键找到了原因 from sqlalchemy import inspect insp = inspec
sqlalchemy
反映一个表:
PilotCycle = Table('PilotCycle', pr_meta, schema='dbo', autoload=True, autoload_with=pr_engine)
但是,我收到一个错误:“ArgumentError:不支持具有重复源列引用的ForeignKeyConstraint。”
我想我通过检查表的外键找到了原因
from sqlalchemy import inspect
insp = inspect(pr_engine)
fks = insp.get_foreign_keys('PilotCycle')
print(fks)
这将返回一个DICT列表,其中每个元素都是外键约束。我找到了一个外键,'FK\u PilotCycle\u device'
,它具有重复的约束列(EquipmentID
)和重复的引用列(ID
)。以下是我所指清单中的格言:
{
'name': 'FK_PilotCycle_Equipment',
'constrained_columns': ['EquipmentID', 'EquipmentID'],
'referred_schema': None,
'referred_table': 'Equipment',
'referred_columns': ['ID', 'ID']
}
我对数据库有只读访问权限。我怎样才能解决这个问题 我刚刚花了一天时间讨论同一个问题,如果没有解决的话,至少已经找到了问题的根源 此错误是由同一数据库中两个同名主键引起的——即使外键位于彼此无关的模式和表中 根本问题是数据库检查查询是如何用
方言/mssql/base.py
编写的:
```SELECT [C].[COLUMN_NAME],
[R].[TABLE_SCHEMA],
[R].[TABLE_NAME],
[R].[COLUMN_NAME],
[INFORMATION_SCHEMA].[REFERENTIAL_CONSTRAINTS].[CONSTRAINT_NAME],
[INFORMATION_SCHEMA].[REFERENTIAL_CONSTRAINTS].[MATCH_OPTION],
[INFORMATION_SCHEMA].[REFERENTIAL_CONSTRAINTS].[UPDATE_RULE],
[INFORMATION_SCHEMA].[REFERENTIAL_CONSTRAINTS].[DELETE_RULE]
FROM [INFORMATION_SCHEMA].[KEY_COLUMN_USAGE] AS [C], [INFORMATION_SCHEMA].[KEY_COLUMN_USAGE] AS [R], [INFORMATION_SCHEMA].[REFERENTIAL_CONSTRAINTS]
WHERE [C].[TABLE_NAME] = CAST('MYTABLE' AS NVARCHAR(max)) AND [C].[TABLE_SCHEMA] = CAST('MYSCHEMA' AS NVARCHAR(max)) AND [INFORMATION_SCHEMA].[REFERENTIAL_CONSTRAINTS].[CONSTRAINT_SCHEMA] = [C].[TABLE_SCHEMA] AND [C].[CONSTRAINT_NAME] = [INFORMATION_SCHEMA].[REFERENTIAL_CONSTRAINTS].[CONSTRAINT_NAME] AND [R].[CONSTRAINT_NAME] = [INFORMATION_SCHEMA].[REFERENTIAL_CONSTRAINTS].[UNIQUE_CONSTRAINT_NAME] AND [C].[ORDINAL_POSITION] = [R].[ORDINAL_POSITION] ORDER BY [INFORMATION_SCHEMA].[REFERENTIAL_CONSTRAINTS].[CONSTRAINT_NAME], [R].[ORDINAL_POSITION]``
如果将数据库中的MYTABLE
和MYSCHEMA
替换为有问题的表,应该会看到返回一行,该行具有相同的约束名称,但来自完全不同的表
以下查询将查找数据库中所有冲突的主键名称:
select CONSTRAINT_NAME, count(*)
from INFORMATION_SCHEMA.TABLE_CONSTRAINTS
where CONSTRAINT_TYPE = 'PRIMARY KEY'
group by CONSTRAINT_NAME
having count(*) > 1
不幸的是,如果您没有权限更改DB DDL,我看不到简单的解决方案
我已经提交了一个问题和一个修复SQLAlchemy bug的PR: