Ingegnere inverso SQLAlchemy definizione di classe dichiarativa dal database MySQL esistente?

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

  •  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)
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top