2009-09-15 14 views
20

Tengo una base de datos mysql preexistente que contiene alrededor de 50 tablas.¿Invertir la definición de clase declarativa SQLAlchemy de la base de datos MySQL existente?

En lugar de código de mano de una clase de estilo declarativo sqlalchemy (as shown here) para cada tabla, ¿hay una herramienta/script/comando que se puede ejecutar contra la base de datos MySQL que generar una clase Python en el estilo declarativo para cada tabla en la base de datos?

Por poner un solo cuadro como ejemplo (que generaría para los 50 idealmente) de la siguiente manera:

+---------+--------------------+ 
| 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    | 
+---------+--------------------+ 

¿Existe una herramienta/script/comando que puede generar un archivo de texto que contiene algo como:

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

Este es un buen ejemplo de por qué debe evitar los generadores SQL :). –

+11

uh ¿por qué sería eso? – zzzeek

Respuesta

28

uso sqlautocode:

Es una herramienta flexible para autogenerar un modelo a partir de una base de datos existente.

Este es un enfoque ligeramente diferente a SqlSoup, que le permite usar tablas sin definirlas explícitamente. Por otro lado, sqlalutocode generará un código python real.

+0

excelente, gracias –

+0

última versión de sqlautocode fue en 2010, y no parece funcionar con la última sqlalchemy. ¿Hay una alternativa más actual? – goncalopp

+7

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

4

SqlSoup puede realizar el mapeo introspectivo de un esquema de SQL existente.

+0

sí, pero no es compatible con Python 3. Estoy tratando de portarlo ahora. –

6

Tenga en cuenta declarativo se puede utilizar con las tablas reflejadas. Por lo tanto, si el tiempo de arranque no fuera un gran problema, podría hacer esto:

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) 

que no sea ese autocode probablemente sea el camino a seguir.

Cuestiones relacionadas