从现有的MySQL数据库中反向设计SQLAlchemy声明性类定义?

Pet*_*McG 24 python mysql sqlalchemy

我有一个预先存在的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              |
+---------+--------------------+
Run Code Online (Sandbox Code Playgroud)

是否有工具/脚本/命令可以生成包含以下内容的文本文件:

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)
Run Code Online (Sandbox Code Playgroud)

nos*_*klo 30

使用sqlautocode:

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

这是一种与SqlSoup略有不同的方法,它允许您在不明确定义表的情况下使用表.另一方面,sqlalutocode将生成实际的python代码.

  • @goncalopp:是的,[sqlacodegen](https://pypi.python.org/pypi/sqlacodegen) (8认同)
  • “有更当前的替代方案吗?” 是:[sqlacodegen](https://pypi.org/project/sqlacodegen/) (2认同)

Joh*_*rug 9

现在(2015年)您可能想要使用https://pypi.python.org/pypi/sqlacodegen来代替!


zzz*_*eek 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)
Run Code Online (Sandbox Code Playgroud)

除了自动编码可能是要走的路.


Bil*_*win 5

SqlSoup可以对现有SQL模式执行自省映射。