Проблемы при добавлении ограничений внешнего ключа с psycopg2 - PullRequest
0 голосов
/ 05 января 2020

Я пытаюсь добавить ограничение внешнего ключа в существующую таблицу. Причина, по которой я не просто добавляю внешние ключи в первоначальный запрос (запрос, который создает таблицу), заключается в том, что у меня будет несколько ссылок, которые различаются (т. Е. Некоторые таблицы будут иметь больше ссылок, чем другие), и использую ALTER TABLE кажется единственным вариантом при работе с неопределенностью.

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

alter_query = """
                ALTER TABLE {schema}.{table}
                ADD CONSTRAINT {fk} FOREIGN KEY ({hashKey})
                REFERENCES {reference} ({hub_hash});
                """

#Note, that i = "company" in this example.

final_alter_query = sql.SQL(alter_query).format(
                                             schema=sql.Identifier(clientID),
                                             table=sql.Identifier(tableName),
                                             fk=sql.Identifier(tableName+"_"+i+"_hash_key_fk"),
                                             hashKey=sql.Identifier(i+"_hash_key"),
                                             reference=sql.Identifier(clientID+".hub_"+i),
                                             hub_hash=sql.Identifier(i+"_hash_key")
                                             )

Чтобы сделать его более понятным, фактический SQL сгенерированный:

    ALTER TABLE "c0001000_business_vault"."lnk_company_registration"
    ADD CONSTRAINT "lnk_company_registration_company_hash_key_fk" FOREIGN KEY ("company_hash_key")
    REFERENCES "c0001000_business_vault.hub_company" ("company_hash_key");

Это дает следующую ошибку: (и да, отношение существует)

cur2.execute(final_alter)
psycopg2.errors.UndefinedTable: relation "c0001000_business_vault.hub_company" does not exist

Я не понимаю, почему это внезапно дает мне ошибки, потому что это работает, когда я использую формат без sql .Identifier, но я должен сделать это таким образом в соответствии с документацией psycopg2 .

Ответы [ 2 ]

0 голосов
/ 05 января 2020

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

Схема и таблица цитирования не должны содержать. разделитель. Получите это, чтобы сгенерировать это вместо:

 ALTER TABLE "c0001000_business_vault"."lnk_company_registration"
    ADD CONSTRAINT "lnk_company_registration_company_hash_key_fk" FOREIGN KEY ("company_hash_key")
    REFERENCES "c0001000_business_vault"."hub_company" ("company_hash_key");
0 голосов
/ 05 января 2020

Ваша проблема связана с отсутствием ".

Попробуйте изменить эту строку:

reference=sql.Identifier(clientID+".hub_"+i),

Для этого:

reference=sql.Identifier(clientID+"\".\"hub_"+i),
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...