Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SQLAlchemy表反射-删除重复的源列引用_Python_Sqlalchemy - Fatal编程技术网

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:

如果你有困难的话,你也许可以接受我的公关和猴子贴片炼金术,尽管我自己还没有尝试过