sql >> Databáze >  >> RDS >> PostgreSQL

Nastavte SQLAlchemy na použití PostgreSQL SERIAL pro generování identity

Váš PRIMARY KEY by měl být definován tak, aby používal SEQUENCE jako DEFAULT , buď prostřednictvím SERIAL pohodlí pseudotyp:

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

nebo explicitní 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;

Toto je diskutováno v dokumentaci SQLAlchemy .

Toto můžete přidat do existující tabulky:

CREATE SEQUENCE blah_id_seq OWNED BY blah.id;

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

pokud dáváte přednost obnovení výpisu, přidejte sekvence ručně.

Pokud existují data, která jste načetli přímo do tabulek pomocí COPY nebo podobně, musíte nastavit počáteční bod sekvence:

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

Řekl bych, že problém bude pravděpodobně souviset s vaším vývojem v SQLite, následným provedením výpisu a obnovením tohoto výpisu do PostgreSQL. SQLAlchemy očekává, že vytvoří schéma samo o sobě s příslušnými výchozími hodnotami a sekvencemi.

Doporučuji vám místo toho nechat SQLAlchemy vytvořit novou prázdnou databázi. Uložte data pro každou tabulku z SQLite DB do CSV a poté COPY tato data do tabulek PostgreSQL. Nakonec aktualizujte sekvence pomocí setval takže generují příslušné hodnoty.

Tak či onak to budete potřebovat abyste se ujistili, že jsou vytvořeny příslušné sekvence. Můžete to udělat pomocí SERIAL pseudosloupcové typy, nebo ručně SEQUENCE vytvoření a DEFAULT nastavení, ale musíte to udělat. Jinak neexistuje způsob, jak přiřadit vygenerované ID tabulce účinným a souběžně bezpečným způsobem.



  1. SQL Server 2008 – Spouští se spouštěč se stejnými oprávněními jako přihlášení/uživatel?

  2. Uložení cesty k souboru nahraného obrázku do databáze MySQL

  3. Funkce SUM() v MariaDB

  4. MySQL - Odečtení hodnoty z předchozího řádku, seskupit podle