engenheiro SQLAlchemy definição de classe declarativa reversa do banco de dados MySQL existente?
-
07-07-2019 - |
Pergunta
Eu tenho um banco de dados mysql pré-existente que contém cerca de 50 mesas.
Ao invés de código mão uma classe de estilo SqlAlchemy declarativa ( como mostrado aqui ) para cada tabela, existe uma ferramenta / script / comando eu posso correr contra o banco de dados mysql que irá gerar uma classe python no estilo declarativa para cada tabela no banco de dados?
Para dar apenas uma tabela como um exemplo (geraria para todos os 50 idealmente) como segue:
+---------+--------------------+
| 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 uma ferramenta / script / comando que pode gerar um arquivo de texto contendo 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)
Solução
É uma ferramenta flexível para gerar automaticamente um modelo a partir de um banco de dados existente.
Esta é uma abordagem um pouco diferente para SqlSoup , que permite utilizar tabelas sem explicitamente defini-los. Por outro lado, sqlalutocode irá gerar o código python real.
Outras dicas
Agora (em 2015), você provavelmente iria querer usar https://pypi.python.org/pypi / sqlacodegen vez!
Tenha em mente declarativa pode ser usado com tabelas refletidos. Então, se o tempo de inicialização não foram um enorme problema que você poderia fazer isso:
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)
diferente do que autocode é provavelmente o caminho a percorrer.
SqlSoup pode realizar mapeamento introspectiva de um esquema SQL existente.