从现有MySQL数据库反向工程SQLAlchemy声明式类定义?

25 投票
4 回答
9954 浏览
提问于 2025-04-15 14:20

我有一个已经存在的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 个回答

8

请记住,声明式编程可以和反射表一起使用。所以如果启动时间不是一个大问题,你可以这样做:

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)

除此之外,自动代码可能是更好的选择。

12

现在(在2015年),你可能更想使用这个链接提供的工具:https://pypi.python.org/pypi/sqlacodegen

31

使用 sqlautocode

这是一个灵活的工具,可以从现有的数据库自动生成模型。

这个方法和 SqlSoup 有点不同,SqlSoup 让你可以在不明确定义表的情况下使用它们。而 sqlalutocode 则会生成实际的 Python 代码。

撰写回答