engenheiro SQLAlchemy definição de classe declarativa reversa do banco de dados MySQL existente?

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

  •  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)
Foi útil?

Solução

sqlautocode :

É 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top