Обратный инженер SQLAlchemy определение декларативного класса из существующей базы данных MySQL? - PullRequest
22 голосов
/ 15 сентября 2009

У меня уже есть база данных mysql, содержащая около 50 таблиц.

Вместо того, чтобы вручную кодировать декларативный класс SqlAlchemy стиля (, как показано здесь ) для каждой таблицы, есть ли инструмент / скрипт / команда, которую я могу запустить для базы данных mysql, которая будет генерировать класс python в декларативном стиле для каждой таблицы в базе данных?

В качестве примера можно взять только одну таблицу (в идеале - для всех 50):

+---------+--------------------+
| 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              |
+---------+--------------------+

Существует ли инструмент / скрипт / команда, которая может генерировать текстовый файл, содержащий что-то вроде:

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)

Ответы [ 4 ]

28 голосов
/ 15 сентября 2009

использовать sqlautocode :

Это гибкий инструмент для автоматического создания модели из существующей базы данных.

Это немного другой подход к SqlSoup , который позволяет вам использовать таблицы без явного их определения. С другой стороны, sqlalutocode будет генерировать реальный код Python.

8 голосов
/ 04 февраля 2015

Теперь (в 2015 году) вы, вероятно, захотите использовать https://pypi.python.org/pypi/sqlacodegen вместо!

7 голосов
/ 16 сентября 2009

Имейте в виду, декларативные могут использоваться с отраженными таблицами. Так что, если время запуска не было большой проблемой, вы могли бы сделать это:

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)

кроме этого автокода, вероятно, есть путь.

4 голосов
/ 15 сентября 2009

SqlSoup может выполнять интроспективное отображение существующей схемы SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...