PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Sqlalchemy e PostgreSql:como definir a chave primária manualmente sem conflitos no futuro?


Não conheço nenhuma maneira segura e eficiente de fazer o que você quer. Você deve realmente escolher se deseja definir as chaves por conta própria ou usar as chaves geradas e manter uma estratégia ou outra.

Se você não se importa com a concorrência terrível, você pode LOCK TABLE thetable , faça seu trabalho, setval a sequência do identificador da tabela para o próximo valor livre após o que você inseriu e commit para liberar o bloqueio. No entanto, isso ainda causará problemas com aplicativos que chamam explicitamente nextval (como muitos ORMs) em vez de deixar o banco de dados definir o valor omitindo-o do ?INSERT lista de colunas ou nomeando-a explicitamente como DEFAULT .

Caso contrário, você pode fazer com que seu código (ou uma função auxiliar PL/PgSQL) faça a inserção em um loop de repetição que incrementa a chave e tenta novamente quando recebe um erro de integridade. Essa estratégia não funcionará se você precisar fazer mais do que apenas uma inserção por transação. Além disso em SERIALIZABLE modo de isolamento Eu não acho que você pode fazer isso com PL/PgSQL, você tem que usar um loop de repetição do lado do cliente para lidar com falhas de serialização.

É uma ideia terrível. Use chaves definidas pelo aplicativo de forma consistente ou chaves definidas pelo banco de dados de forma consistente. Não misture os dois.