2012-01-23 20 views
6

Jak utworzyć tabelę za pomocą ORM Klasy deklaratywnej bez klucza podstawowego? Nie udało się uruchomić, jeśli nie zrobiłem żadnej kolumny primary_key = True.Deklaracja SQLAlchemy: tabela bez kluczy podstawowych?

+0

czy mogę zapytać, dlaczego chciałbyś zrobić coś takiego? –

+0

@ JonathanOng Ponieważ chciałbym dodać niektóre indeksy później i wygląda na to, że mysql może zrobić coś takiego. – Determinant

Odpowiedz

11

SQLAlchemy core nie narzeka na brakujący klucz podstawowy, więc istnieje możliwość utworzenia takiej tabeli z Table(…). Jednak ORM według projektu wymaga sposobu identyfikacji wiersza odpowiadającego obiektowi, więc nie można używać tabeli bez klucza podstawowego w ORM.

Dlaczego musisz dodać ten indeks później? Czy to rzeczywisty wymóg, czy próba rozwiązania jakiegoś problemu, który prawdopodobnie można rozwiązać w inny sposób? W przypadku, gdy potrzebny jest złożony klucz podstawowy, można go zdefiniować za pomocą argumentu primary_key=True w kilku s kach Column lub podając PrimaryKeyConstraint(…) w __table_args__.

+0

Zamierzam utworzyć indeks z wieloma kolumnami. Byłoby świetnie, gdybym mógł jednoznacznie oświadczyć, że indeks musi być skonstruowany przy pomocy BTREE (moja baza to MySQL). Jakieś rozwiązania? – Determinant

+1

Większość baz danych (w tym MySQL) używa domyślnie drzewa B-tree, więc po prostu określ "primary_key = True" we wszystkich "kolumnach" uczestniczących w indeksie złożonym. Jawna specyfikacja B-Tree (lub innego typu) jest obsługiwana w 'Index (...)' np. dla PostgreSQL, ale nie dla MySQL, a nie w "PrimaryKeyConstraint". Wygląda na brakującą funkcję w SQLAlchemy. –

+6

możesz również umieścić listę kolumn, które są "pierwotne" w argumencie "primary_key" dla programu odwzorowującego(), z deklaratywnym '__mapper_args__ = {" primary_key ":(col1, col2)}}' – zzzeek