sql >> Database >  >> RDS >> PostgreSQL

Stel SQLAlchemy in om PostgreSQL SERIAL te gebruiken voor het genereren van identiteit

Uw PRIMARY KEY moet worden gedefinieerd om een ​​SEQUENCE . te gebruiken als een DEFAULT , ofwel via de SERIAL gemak pseudo-type:

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

of een expliciete 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;

Dit wordt besproken in de SQLAlchemy-documentatie .

U kunt dit toevoegen aan een bestaande tabel:

CREATE SEQUENCE blah_id_seq OWNED BY blah.id;

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

als je liever een dump herstelt, voeg dan handmatig sequenties toe.

Als er bestaande gegevens zijn die u rechtstreeks in de tabellen hebt geladen met COPY of iets dergelijks, moet u het startpunt van de reeks instellen:

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

Ik zou zeggen dat het probleem waarschijnlijk te maken heeft met het ontwikkelen in SQLite, het uitvoeren van een dump en het herstellen van die dump naar PostgreSQL. SQLAlchemy verwacht het schema zelf te maken met de juiste standaardwaarden en sequenties.

Wat ik u in plaats daarvan aanbeveel, is om SQLAlchemy een nieuwe, lege database te laten maken. Dump de gegevens voor elke tabel van de SQLite DB naar CSV, dan COPY die gegevens in de PostgreSQL-tabellen. Werk ten slotte de reeksen bij met setval zodat ze de juiste waarden genereren.

Op de een of andere manier heb je nodig om ervoor te zorgen dat de juiste reeksen worden gemaakt. Je kunt het doen door SERIAL pseudo-kolomtypes, of handmatig SEQUENCE creatie en DEFAULT instelling, maar u moet het doen. Anders is er geen manier om een ​​gegenereerde ID op een efficiënte, gelijktijdigheidsveilige manier aan de tabel toe te wijzen.



  1. Entiteitsframework PostgreSQL

  2. 'end' gebruiken als kolomnaam in Ruby on Rails (MySQL)

  3. de vlag CLIENT_FOUND_ROWS in django wijzigen voor mysql-python (MySQLdb)?

  4. Hoe innerlijk meedoen met niet in of niet bestaan ​​in mysql-query?