2015-08-27 2 views
1

Dites que j'ai deux tables, foo et bar. Les deux ont des clés primaires. Je veux le configurer dans SQLAlchemy afin que l'ensemble combiné de foo.id et bar.id soit unique. Comment ferais-je cela?SQLAlchemy schéma qui permet à deux tables de partager une colonne de clé primaire

J'ai essayé d'ajouter une autre table ne contenant que les clés primaires et ayant des clés étrangères dans foo et bar, comme ceci:

class foo(Base): 
    __tablename__ = 'foo' 
    id = Column(Integer, ForeignKey('primary_keys.id'), primary_key=True) 

class bar(Base): 
    __tablename__ = 'bar' 
    id = Column(Integer, ForeignKey('primary_keys.id'), primary_key=True) 

class primary_keys(Base): 
    __tablename__ = 'primary_keys' 
    id= Column(Integer, primary_key=True) 

Mais il m'a donné cette erreur:

FlushError: Instance has a NULL identity key. If this is an auto-generated value, check that the database table allows generation of new primary key values, and that the mapped Column object is configured to expect these generated values. Ensure also that this flush() is not occurring at an inappropriate time, such aswithin a load() event.

est-il peut-être une meilleure solution pour ce que j'essaie de faire?

EDIT: J'utilise un sqlite db.

+0

Quelle base de données est-ce sur? Je crois que cela devrait fonctionner comme écrit avec MS-SQL. En outre, je suppose que vous utilisez la fonction ['create_all'] (http://docs.sqlalchemy.org/en/rel_1_0/core/metadata.html#sqlalchemy.schema.MetaData.create_all)? – user25064

+0

Désolé, j'utilise sqlite. Et oui je suis. – Niel

+0

Je crois que cela devrait fonctionner comme codé, peut-être que vous pouvez fournir un exemple entièrement exécutable qui provoque l'erreur. – user25064

Répondre

0

Si vous utilisez postgresql ou oracle, les clés primaires de foo et de barre peuvent être définies pour utiliser les mêmes séquences.

http://docs.sqlalchemy.org/en/rel_1_0/core/defaults.html#defining-sequences

table = Table("cartitems", meta, 
    Column("cart_id", Integer, Sequence('cart_id_seq'), primary_key=True), 
) 

l'objet séquence serait essentiellement faire ce que vous essayez de faire avec votre primary_keys tableau

+0

C'est intéressant, mais j'utilise sqlite. – Niel