Ingeniería inversa Definición de clase declarativa SQLAlchemy de la base de datos MySQL existente?

StackOverflow https://stackoverflow.com/questions/1425412

  •  07-07-2019
  •  | 
  •  

Pregunta

Tengo una base de datos mysql preexistente que contiene alrededor de 50 tablas.

En lugar de codificar a mano, una clase SqlAlchemy de estilo declarativo ( como se muestra aquí ) para cada tabla, ¿hay alguna herramienta / script / comando que pueda ejecutar contra la base de datos mysql que generará una clase de python en el estilo declarativo para cada tabla en la base de datos?

Para tomar solo una tabla como ejemplo (lo ideal sería generar las 50) 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 pueda generar un archivo de texto que contenga 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)
¿Fue útil?

Solución

use 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 explícitamente definiéndolos. Por otro lado, sqlalutocode generará código python real.

Otros consejos

Ahora (en 2015) probablemente quiera usar https://pypi.python.org/pypi / sqlacodegen en su lugar!

Tenga en cuenta que declarative se puede usar con tablas reflejadas. Entonces, si el tiempo de inicio 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)

aparte de ese autocódigo es probablemente el camino a seguir.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top