Ingegnere inverso SQLAlchemy definizione di classe dichiarativa dal database MySQL esistente?
-
07-07-2019 - |
Domanda
Ho un database mysql preesistente contenente circa 50 tabelle.
Invece di codificare manualmente una classe SqlAlchemy in stile dichiarativo ( come mostrato qui ) per ogni tabella, c'è uno strumento / script / comando che posso eseguire contro il database mysql che genererà una classe python nello stile dichiarativo per ogni tabella nel database?
Per prendere solo una tabella come esempio (genererebbe idealmente per tutti e 50) come 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 |
+---------+--------------------+
Esiste uno strumento / script / comando che può generare un file di testo contenente qualcosa del tipo:
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)
Soluzione
usa sqlautocode :
È uno strumento flessibile per generare automaticamente un modello da un database esistente.
Questo è un approccio leggermente diverso a SqlSoup , che ti consente di utilizzare le tabelle senza esplicitamente definendoli. D'altra parte, sqlalutocode genererà il vero codice python.
Altri suggerimenti
Ora (nel 2015) probabilmente vorresti usare https://pypi.python.org/pypi / sqlacodegen invece!
Ricorda che può essere utilizzato con le tabelle riflesse. Quindi, se il tempo di avvio non fosse un grosso problema, potresti farlo:
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)
diverso da quello autocode è probabilmente la strada da percorrere.
SqlSoup può eseguire la mappatura introspettiva di uno schema SQL esistente.