Reverse engineering d'une définition de classe déclarative SQLAlchemy à partir d'une base de données MySQL existante?

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

  •  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)
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top