Обратный инженер SQLAlchemy определение декларативного класса из существующей базы данных MySQL?
-
07-07-2019 - |
Вопрос
У меня есть уже существующая база данных 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)
Решение
используйте sqlautocode :
Это гибкий инструмент для автоматического создания модели из существующей базы данных.
Это немного другой подход к SqlSoup , который позволяет использовать таблицы без явного определяя их. С другой стороны, sqlalutocode будет генерировать реальный код Python.
Другие советы
Теперь (в 2015 году) вы, вероятно, захотите использовать https://pypi.python.org/pypi / sqlacodegen вместо этого!
Имейте в виду, что декларативные могут использоваться с отраженными таблицами. Так что, если время запуска не было большой проблемой, вы могли бы сделать это:
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)
кроме этого автокода, вероятно, есть путь. Р>
SqlSoup может выполнять внутреннее сопоставление существующей схемы SQL.