2009-09-15 20 views
20

Mam już istniejącą bazę danych mysql zawierającą około 50 tabel.Odwrotna inżynierska deklaracja klasy SQLAlchemy z istniejącej bazy danych MySQL?

Zamiast kodu strony klasa deklaratywne styl sqlalchemy (as shown here) dla każdej tabeli, czy istnieje narzędzie/skrypt/command mogę uruchomić przeciwko bazy mysql, który będzie generować klasę pyton w deklaratywnej stylu dla każdej tabeli w bazie danych?

Aby wziąć tylko jedną tabelę jako przykład (wygeneruje dla wszystkich 50 idealnie) w następujący sposób:

+---------+--------------------+ 
| dept_no | dept_name   | 
+---------+--------------------+ 
| d009 | Customer Service | 
| d005 | Development  | 
| d002 | Finance   | 
| d003 | Human Resources | 
| d001 | Marketing   | 
| d004 | Production   | 
| d006 | Quality Management | 
| d008 | Research   | 
| d007 | Sales    | 
+---------+--------------------+ 

Czy istnieje narzędzie/skrypt/poleceń, które może wygenerować plik tekstowy zawierający coś takiego:

from sqlalchemy.ext.declarative import declarative_base 

Base = declarative_base() 

class Department(Base): 
    __tablename__ = 'departments' 

    dept_no = Column(String(5), primary_key=True) 
    dept_name = Column(String(50)) 

    def __init__(self, dept_no, dept_name): 
     self.dept_no = dept_no 
     self.dept_name = dept_name 

    def __repr__(self): 
     return "<Department('%s','%s')>" % (self.dept_no, self.dept_name) 
+0

To jest dobry przykład, dlaczego powinieneś unikać generatorów SQL :). –

+11

dlaczego tak? – zzzeek

Odpowiedz

28

użycie sqlautocode:

Jest to elastyczne narzędzie do autogenerować model z istniejącej bazy danych.

To jest nieco inne podejście do SqlSoup, które pozwala używać tabel bez jawnego ich definiowania. Z drugiej strony, sqlalutocode wygeneruje rzeczywisty kod Pythona.

+0

super, dziękuję –

+0

najnowsze wydanie programu sqlautocode miało miejsce w 2010 roku i wydaje się nie działać z najnowszą wersją sqlalchemy. Czy istnieje bardziej aktualna alternatywa? – goncalopp

+7

@ goncalopp: Tak, [sqlacodegen] (https://pypi.python.org/pypi/sqlacodegen) – Pakman

4

SqlSoup może wykonywać introspekcyjne mapowanie istniejącego schematu SQL.

+0

tak, ale nie obsługuje Pythona 3. Próbuję przenieść go teraz. –

6

Należy pamiętać, że deklaratywny może być używany z tabelami odbitymi. Więc jeśli czas startowy nie był to ogromny problem można to zrobić:

engine = create_engine('mysql://...') 
meta = MetaData() 
meta.reflect(bind=engine) 
for table in meta.tables.values(): 
    print """ 
class %s(Base): 
    __table__ = Table(%r, Base.metadata, autoload=True) 

""" % (table.name, table.name) 

inny niż ten bez kodowania jest chyba do zrobienia.

Powiązane problemy