2016-03-02 19 views
6

Tôi đang cố gắng tạo bảng trực tiếp từ dữ liệu hiện có ... tuy nhiên, bảng tôi cần có hai Khóa chính. Tôi không thể tìm cách thỏa mãn các hạn chế.Không thể ánh xạ ForeignKey do hai Khóa chính

I.e. Tôi bắt đầu với hai bảng sau ...

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()), 
    ) 

Khi tôi cố gắng những điều sau đây, nó hoạt động ...

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

Tuy nhiên, cả sau cung cấp cho tôi những lỗi ...

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 Server\nDB-Lib error message 20018, severity 16:\nGeneral SQL Server error: Check messages from the SQL Server\n") [SQL: '\nCREATE TABLE [testtable] (\n\t[PATID] INTEGER NULL, \n\tFOREIGN KEY([PATID]) REFERENCES [DDB_PAT_BASE] ([PATID])\n)\n\n'] 

Trả lời

3

Bảng bạn đang trỏ đến có một khóa chính tổng hợp, không phải nhiều khóa chính. Vì thế. bạn cần phải tạo khóa ngoài tổng hợp, không phải hai khóa ngoại chỉ tới mỗi nửa khóa chính của composite:

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

Đẹp. Cảm ơn! – RightmireM

Các vấn đề liên quan