Не удается сопоставить ForeignKey из-за двух первичных ключей

Я пытаюсь создать таблицы на лету из существующих данных...однако таблица, в которой я нуждаюсь, имеет два первичных ключа. Я не могу найти, Как удовлетворить ограничений.

т. е. Я начну со следующих двух таблиц...

self.DDB_PAT_BASE = Table('DDB_PAT_BASE', METADATA, 
    Column('PATID', INTEGER(), primary_key=True),
    Column('PATDB', INTEGER(), primary_key=True),
    Column('FAMILYID', INTEGER()),
)

self.DDB_ERX_MEDICATION_BASE = Table('DDB_ERX_MEDICATION_BASE', METADATA, 
    Column('ErxID', INTEGER(), primary_key=True),
    Column('ErxGuid', VARCHAR(length=36)),
    Column('LastDownload', DATETIME()),
    Column('LastUpload', DATETIME()),
    Column('Source', INTEGER()),
    )

когда я пробую следующее, это работает...

t = Table('testtable', METADATA,
    Column('ErxID', INTEGER(), ForeignKey('DDB_ERX_MEDICATION_BASE.ErxID')),
    )     
t.create()

однако и после дать мне ошибку...

t = Table('testtable', METADATA,
    Column('PATID', INTEGER(), ForeignKey('DDB_PAT_BASE.PATID')),
)
t.create()

t = Table('testtable', METADATA,
    Column('PATID', INTEGER(), ForeignKey('DDB_PAT_BASE.PATID')),
    Column('PATDB', INTEGER(), ForeignKey('DDB_PAT_BASE.PATDB')),
)
t.create()


sqlalchemy.exc.OperationalError: (pymssql.OperationalError) (1776, "There are no primary or candidate keys in the referenced table 'DDB_PAT_BASE' that match the referencing column list in the foreign key 'FK__testtabl__PATID__3FD3A585'.DB-Lib error message 20018, severity 16:nGeneral SQL Server error: Check messages from the SQL ServernDB-Lib error message 20018, severity 16:nGeneral SQL Server error: Check messages from the SQL Servern") [SQL: 'nCREATE TABLE [testtable] (nt[PATID] INTEGER NULL, ntFOREIGN KEY([PATID]) REFERENCES [DDB_PAT_BASE] ([PATID])n)nn']

1 ответов


таблица, на которую вы указываете, имеет композитные первичный ключ, а не несколько первичных ключей. Следовательно. вам нужно создать составной внешний ключ, а не два внешних ключа, указывающих на каждую половину составного первичного ключа:

t = Table('testtable', METADATA,
    Column('PATID', INTEGER()),
    Column('PATDB', INTEGER()),
    ForeignKeyConstraint(['PATID', 'PATDB'], ['DDB_PAT_BASE.PATID', 'DDB_PAT_BASE.PATDB']),
)
t.create()