2016-03-22 10 views
0

Ich habe Tabelle mit 2 Primärschlüsseln, wobei der zweite Primärschlüssel auch ein Fremdschlüssel ist. Wenn ich versuche, die Datenbank aufzufüllen, bekomme ich den Fehler "NOT NULL constraint failed: items.id1". Beim Auffüllen werde ich immer eine bekannte ID für ID2 bereitstellen. Also, wie kann ich die sqlalchemy zu autoincrement id1 machen?SQLAlchemy Tabelle mit 2 primary_keys wie autoincrement der erste Primärschlüssel

class items(Base): 
    __tablename__ = 'items' 
    id1 = Column(BIGINT(unsigned=True).with_variant(Integer, "sqlite"), primary_key=True,) 
    #location id 
    id2 = Column(Integer, ForeignKey('table2.id'), primary_key=True) 

Die Kombination von ID1 und ID2 muss immer eindeutig sein, und die Kombination dieser beiden Elemente wird zur Identifizierung der Elemente verwendet. id1 ist nicht genug, da Datenbanken an mehreren Orten sein können und Tabellen von Zeit zu Zeit synchronisiert werden.

Ich habe bereits versucht, diese Lösung, aber es ist veraltet und nicht mehr funktioniert: How to insert a row with autoincrement id in a multi-primary-key table?

EDIT: Arbeit um für dieses Problem Postgres DB zu verwenden ist. SQLite ist lite, aber dumm.

+0

Versuchen Sie dieses autoincrement = True –

+0

Nichts, der gleiche Fehler. –

+0

Eine andere Option ist die Verwendung von Uuids anstelle von 2 Primärschlüsseln. So weißt du immer, dass deine ID eindeutig ist: 'von uuid import uuid4; id = Spalte (String, primärer_key = True, default = lambda: uuid4()) '. An diesem Punkt können Sie den Primärschlüssel für den Fremdschlüssel löschen, da dieser nicht mehr als Kennung benötigt wird. –

Antwort

0

Wenn Sie SQLite verwenden:

id1 = Column(BIGINT(unsigned=True).with_variant(Integer, "sqlite"), primary_key=True, sqlite_autoincrement=True) 
id2 = Column(Integer, ForeignKey('table2.id'), primary_key=True, sqlite_autoincrement=False) 

Wenn Sie MySQL verwenden, dann einfach autoincrement funktioniert:

id1 = Column(BIGINT(unsigned=True).with_variant(Integer, "sqlite"), primary_key=True, autoincrement=True) 
id2 = Column(Integer, ForeignKey('table2.id'), primary_key=True, autoincrement=False) 

P. S .: Drop-Tabelle wieder erste und versuchen.

+0

"Unbekannte Argumente an Spalte übergeben: ['sqlite_autoincrement']" und wenn ID2 autoincrement = False hat, wird immer noch "NOT NULL constraint failed" angezeigt. Momentan ist mein db sqlite3, aber ich werde es bald zu postgres ändern, vielleicht wird es dort funktionieren ... –

Verwandte Themen