2013-10-02 17 views
8

Próbuję użyć SQLAlchemy z MySQL do utworzenia mapowania tabeli dla tabeli z złożonym kluczem podstawowym, i nie jestem pewien, czy robię to dobrze. Istniejąca tabela jest definiowana za pomocą złożonego klucza podstawowego.Jak zdefiniować złożonego klucza podstawowego w SQLAlchemy

Oto definicja klasy mapowanie:

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 

ten pasuje rekord już w bazie danych a = tabela1 ('test', 'test', 'test')

Jeśli dodać to do sesji i dodać rekordy do tabeli, a następnie pracować z danymi, otrzymuję błąd MySQL (1062 Duplikacja wpisu).

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

Jeśli pracuję z jednego klucza tabeli, otrzymuję ten błąd zamiast:

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

jestem definiowania kompozytowy klucz podstawowy nieprawidłowo? Jeśli nie, to co robię źle dalej w dół dla mnie, aby uzyskać błąd MySQL zamiast błędu Python/SQLAlchemy?

+1

Nie jestem pewien, dostaję to, co robisz. Jeśli ta wartość już istnieje, musisz zapytać o nią, a nie tworzyć nową: 'a = session.query (table1) .filter (table1.col1 == 'test'). Filter (table1.col2 == 'test ") .one()'. Jeśli to * nie * jest dla ciebie jasne, zdecydowanie sugeruję, aby skorzystać z samouczków dostarczonych w dokumentacji. Jeśli nie mam racji co do twojego pytania, proszę je rozwinąć. – javex

+0

której wersji sqlalchemy używasz? –

+0

Brak wystarczających informacji o tym, co się dzieje. [Jak utworzyć przykład minimalny, pełny i sprawdzalny] (http://stackoverflow.com/help/mcve) Wygląda na to, że zarówno przy kluczach złożonych, jak i niekompozytowych, próbujesz dodać wiersz z kluczową wartością subrowu który już znajduje się w tabeli, ale kluczowa deklaracja mówi, że dana kluczowa wartość subrowu może pojawić się tylko raz w tabeli, stąd komunikaty o błędach. Jak piszę, to pytanie ma nagrodę od TerrenceBrannona, który może lepiej zamieścić nowe pytanie, aby mogli podać wystarczające szczegóły z ich własnej sytuacji. – philipxy

Odpowiedz

1

Zgadzam się, że pytanie jest niejasne. Ale możesz użyć poniższych wskazówek. To wybierze z tabeli trial1 w bazie danych test w MySQL. Skomentowane części są alternatywnym sposobem ustawiania ograniczeń klucza głównego.

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) 
Powiązane problemy