Reverse engineering d'une définition de classe déclarative SQLAlchemy à partir d'une base de données MySQL existante?
-
07-07-2019 - |
Question
J'ai une base de données mysql préexistante contenant environ 50 tables.
Plutôt que de coder à la main une classe SqlAlchemy de style déclaratif ( comme indiqué ici ) pour chaque table, existe-t-il un outil / script / commande que je peux exécuter sur la base de données mysql qui générera une classe python dans le style déclaratif de chaque table de la base de données?
Pour prendre un seul tableau à titre d'exemple (générerait pour tous les 50 idéalement) comme suit:
+---------+--------------------+
| 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-t-il un outil / script / commande pouvant générer un fichier texte contenant quelque chose comme:
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)
La solution
utilisez sqlautocode :
C’est un outil flexible pour générer automatiquement un modèle à partir d’une base de données existante.
Il s'agit d'une approche légèrement différente de SqlSoup , qui vous permet d'utiliser des tableaux sans explicitement les définir. En revanche, sqlalutocode générera le code Python actuel.
Autres conseils
Maintenant (en 2015), vous voudrez probablement utiliser https://pypi.python.org/pypi / sqlacodegen à la place!
Gardez à l’esprit que le déclaratif peut être utilisé avec des tables reflétées. Donc, si le temps de démarrage n’était pas un gros problème, vous pouvez le faire:
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)
autre que cet autocode est probablement la voie à suivre.
SqlSoup peut effectuer un mappage introspectif d'un schéma SQL existant.