从现有的MySQL数据库中反向设计SQLAlchemy声明性类定义?
-
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架构的内省映射。
不隶属于 StackOverflow