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?
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
której wersji sqlalchemy używasz? –
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