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

Python 从现有MySQL数据库反向工程SQLAlchemy声明性类定义?,python,mysql,sqlalchemy,Python,Mysql,Sqlalchemy,我有一个预先存在的mysql数据库,其中包含大约50个表 我是否可以对mysql数据库运行一个工具/脚本/命令,为数据库中的每个表生成一个声明式python类,而不是为每个表手工编写一个声明式SqlAlchemy类() 仅以一个表为例(理想情况下,将为所有50个表生成),如下所示: +---------+--------------------+ | dept_no | dept_name | +---------+--------------------+ | d009

我有一个预先存在的mysql数据库,其中包含大约50个表

我是否可以对mysql数据库运行一个工具/脚本/命令,为数据库中的每个表生成一个声明式python类,而不是为每个表手工编写一个声明式SqlAlchemy类()

仅以一个表为例(理想情况下,将为所有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)
来自sqlalchemy.ext.declarative import declarative\u base
Base=声明性_Base()
班级部门(基地):
__tablename_uuu=‘部门’
部门号=列(字符串(5),主键=真)
部门名称=列(字符串(50))
定义初始(自我、部门编号、部门名称):
self.dept\u no=部门号
self.dept\u name=部门名称
定义报告(自我):
返回“%”(self.dept\u编号、self.dept\u名称)
可以对现有SQL架构执行自省映射。

使用:

它是从现有数据库自动生成模型的灵活工具


这是一种稍微不同的方法,它允许您在不显式定义表的情况下使用表。另一方面,sqlalutocode将生成实际的python代码。

请记住,声明性可以用于反射表。因此,如果启动时间不是一个大问题,您可以这样做:

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)

除此之外,自动编码可能是最好的选择

现在(2015年)你可能想用它来代替

这是一个很好的例子,说明了为什么应该避免使用SQL生成器:)。呃,为什么会这样呢?sqlautocode最新版本是在2010年发布的,它似乎不适用于最新的sqlalchemy。还有更新的选择吗?@goncalopp有一个fork-fix。使用
hg
克隆它,手动安装,然后安装
psycopg2
,就可以了。是的,但它不支持Python 3。我现在正在尝试移植它。不为我创建类,只创建表实例。