PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Задайте SQLAlchemy да използва PostgreSQL SERIAL за генериране на самоличност

Вашият PRIMARY KEY трябва да се дефинира да използва SEQUENCE като DEFAULT , или чрез SERIAL удобен псевдотип:

CREATE TABLE blah (
    id serial primary key,
    ...
);

или изрично SEQUENCE :

CREATE SEQUENCE blah_id_seq;

CREATE TABLE blah (
    id integer primary key default nextval('blah_id_seq'),
    ...
);

ALTER SEQUENCE blah_id_seq OWNED BY blah.id;

Това е обсъдено в документацията на SQLAlchemy .

Можете да добавите това към съществуваща таблица:

CREATE SEQUENCE blah_id_seq OWNED BY blah.id;

ALTER TABLE blah ALTER COLUMN id SET DEFAULT nextval('blah_id_seq');

ако предпочитате да възстановите дъмп, добавете последователности ръчно.

Ако има съществуващи данни, които сте заредили директно в таблиците с COPY или подобно, трябва да зададете начална точка на последователността:

SELECT setval('blah_id_seq', max(id)+1) FROM blah;

Бих казал, че проблемът вероятно е свързан с вашата разработка в SQLite, след което правите дъмп и възстановявате този дъмп в PostgreSQL. SQLAlchemy очаква да създаде самата схема със съответните настройки по подразбиране и последователности.

Това, което препоръчвам да направите вместо това, е да накарате SQLAlchemy да създаде нова, празна база данни. Изхвърлете данните за всяка таблица от SQLite DB в CSV, след което COPY тези данни в таблиците на PostgreSQL. Накрая актуализирайте последователностите с setval така че генерират подходящите стойности.

По един или друг начин ще трябвате за да се уверите, че са създадени подходящите последователности. Можете да го направите чрез SERIAL типове псевдо-колони или чрез ръчно SEQUENCE създаване и DEFAULT настройка, но трябва да го направите. В противен случай няма начин да присвоите генериран идентификатор на таблицата по ефективен, безопасен за едновременност начин.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Rails:Как да създадете колона за време с часова зона на postgres

  2. PG::InvalidParameterValue:ГРЕШКА:невалидна стойност за параметър client_min_messages:паника

  3. SequelizeConnectionError:самоподписан сертификат

  4. 8 Нови функции за съвместимост на Oracle в EnterpriseDB PPAS 9.2 Beta

  5. Функция за задействане на PostgreSQL 9.3 за вмъкване в таблица с параметризирано име