web-dev-qa-db-fra.com

Comment définir la clé primaire composite dans SQLalchemy

J'essaie d'utiliser Sqlalchemy avec MySQL pour créer une mappage de table pour une table avec une clé primaire composite, et je ne sais pas si je le fais bien. La table existante est définie avec la clé primaire composite.

Voici la définition de la classe de mappage:

class table1(Base):
    __tablename__ = 'table1'

    col1 = Column(String, primary_key=True)
    col2 = Column(String, primary_key=True)
    col3 = Column(String)

    def __init__ = (self, col1, col2, col3):
        self.col1 = col1
        self.col2 = col2
        self.col3 = col3

ceci correspond déjà à un enregistrement dans la base de données A = Table1 ("test", "test", "test")

Si j'ajoute ceci à la session et ajoute les enregistrements dans le tableau, puis travaillez avec les données, j'obtiens une erreur MySQL (entrée en double 1062).

session.add(a)
b = session.query(table1)
for instance in b:
    print(instance.col1, instance.col2)

Si je travaille avec une table unique, je reçois cette erreur à la place:

New instance <table2 at 0x2f204d0> with identity key 
(<class '__main__.table2'>,('test',)) conflicts with 
persistent instance <table2 at 0x2f88770>

Suis-je en définissant la clé primaire composite incorrectement? Sinon, qu'est-ce que je fais de mal à faire plus loin pour moi d'obtenir l'erreur MySQL au lieu d'une erreur Python/Sqlalchemy?

24
Charlie Carwile

Je conviens que la question est vague. Mais vous pouvez utiliser ce qui suit comme ligne directrice. Cela choisira à partir d'un trial1 Tableau dans une base de données test dans MySQL. Les pièces commentées sont présentes comme une autre façon de configurer les principales contraintes principales.

from sqlalchemy import String, create_engine, MetaData, Column
from sqlalchemy.ext.declarative import declarative_base
# from sqlalchemy.schema import PrimaryKeyConstraint
from sqlalchemy.orm import sessionmaker

engine = create_engine('mysql+pymysql://root:[email protected]/test')
metadata = MetaData(bind=engine)
Base = declarative_base(metadata=metadata)


class TableClassName(Base):
    __tablename__ = 'table1'

    col1 = Column(String, primary_key=True)
    col2 = Column(String, primary_key=True)
    col3 = Column(String)

    # __table_args__ = (
    #     PrimaryKeyConstraint(
    #         col1,
    #         col2),
    #     {})

Session = sessionmaker(bind=engine)
session = Session()

b = session.query(TableClassName)
for instance in b:
   print(instance.col1, instance.col2)
13
Ali Cirik