Обратное определение декларативного класса SQLAlchemy из существующей базы данных MySQL?
У меня есть уже существующая база данных mysql, содержащая около 50 таблиц.
Вместо того, чтобы обрабатывать код класса декларации SqlAlchemy (как показано здесь) для каждой таблицы, есть ли инструмент / script/command Я могу запустить против базы данных 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 |
+---------+--------------------+
Есть ли команда/ script/команда, которая может генерировать текстовый файл, содержащий что-то вроде:
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)
Ответы
Ответ 1
используйте sqlautocode:
Это гибкий инструмент для автоматического создания модели из существующей базы данных.
Это немного другой подход к SqlSoup, который позволяет использовать таблицы без явного определения их. С другой стороны, sqlalutocode будет генерировать фактический код python.
Ответ 2
Помните, что декларативный может использоваться с отраженными таблицами. Поэтому, если время запуска не было большой проблемой, вы могли бы сделать это:
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)
кроме этого автокода, вероятно, путь.
Ответ 3
Теперь (в 2015 году) вы, вероятно, захотите использовать https://pypi.python.org/pypi/sqlacodegen!
Ответ 4
SqlSoup может выполнять интроспективное сопоставление существующей схемы SQL.