Я пытаюсь добавить ограничение внешнего ключа в существующую таблицу. Причина, по которой я не просто добавляю внешние ключи в первоначальный запрос (запрос, который создает таблицу), заключается в том, что у меня будет несколько ссылок, которые различаются (т. Е. Некоторые таблицы будут иметь больше ссылок, чем другие), и использую 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 .