Получение sqlalchemy.exc.ProgrammingError при попытке ссылки на составной внешний ключ - PullRequest
0 голосов
/ 08 мая 2018

У меня есть два класса:

"Test1":

class Test1(Base):
    data = [
        [1, 2],
        [3, 4],
    ]

    a = Column(Integer, primary_key=True)
    b = Column(Integer, primary_key=True)

    def __init__(self, a, b):
        self.a = a
        self.b = b

, на который будет ссылаться "Test2":

class Test2(Base):
    data = [
        [1, 1, 2],
        [2, 3, 4],
    ]

    id = Column(Integer, primary_key=True)
    c = Column(ForeignKey(Test1.a))
    d = Column(ForeignKey(Test1.b))

    __table_args__ = (ForeignKeyConstraint([c, d], [Test1.a, Test1.b]), {})

    def __init__(self, id, c, d):
        self.id = id
        self.c = c
        self.d = d

При попытке сделать это в SQLAlchemy (Python 3) с использованием локальной базы данных PostgreSQL я получаю эту ошибку:

sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) there is 
no unique constraint matching given keys for referenced table "Test1"
[SQL: '\nCREATE TABLE "Test2" (\n\tid SERIAL NOT NULL, \n\ta1 INTEGER, 
\n\tb1 INTEGER, \n\tPRIMARY KEY (id), \n\tFOREIGN KEY(a1, b1) 
REFERENCES "Test1" (a, b), \n\tFOREIGN KEY(a1) REFERENCES "Test1" (a), 
\n\tFOREIGN KEY(b1) REFERENCES "Test1" (b)\n)\n\n'] (Background on this 
error at: http://sqlalche.me/e/f405)

Чтобы подвести итог, я пытаюсь составить таблицу, которая ссылается на другую таблицу через составной внешний ключ ссылочной таблицы, но с примерно 10 попытками обходного пути я не могу решить эту проблему. Золотое печенье для тех, кто делает.

1 Ответ

0 голосов
/ 08 мая 2018

Ни Test1.a, ни Test1.b не являются (уникальными) ключами сами по себе, хотя вы пытаетесь ссылаться на них как таковые с ForeignKey(Test1.a) и ForeignKey(Test1.b). Просто удалите их. Составной внешний ключ, который вы также определили, является правильным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...