【问题标题】:Reverse engineer SQLAlchemy declarative class definition from existing MySQL database?从现有 MySQL 数据库逆向工程 SQLAlchemy 声明性类定义?
【发布时间】:2023-03-07 11:00:02
【问题描述】:

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

不是为每个表手动编写声明性样式的 SqlAlchemy 类 (as shown here),是否有一个工具/脚本/命令我可以针对 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)

【问题讨论】:

  • 这是一个很好的例子,说明了为什么你应该避免使用 SQL 生成器:)。
  • 呃为什么会这样?

标签: python mysql sqlalchemy


【解决方案1】:

使用sqlautocode:

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

这是与SqlSoup 略有不同的方法,它允许您使用表而无需显式定义它们。另一方面,sqlalutocode 会生成实际的 python 代码。

【讨论】:

  • sqlautocode 最新版本是 2010 年,它似乎不适用于最新的 sqlalchemy。有更新的替代方案吗?
  • @goncalopp bitbucket 中有一个分支修复。用hg 克隆它,手动安装,安装psycopg2 就可以了。
  • “有更流行的替代方案吗?”是的:sqlacodegen
【解决方案2】:

现在(2015 年)您可能想改用 https://pypi.python.org/pypi/sqlacodegen

【讨论】:

  • 不为我创建类,只是表实例。
【解决方案3】:

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

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)

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 是的,但它不支持 Python 3。我现在正在尝试移植它。
    猜你喜欢
    • 1970-01-01
    • 2018-12-12
    • 1970-01-01
    • 2020-04-30
    • 1970-01-01
    • 2014-09-30
    • 2016-08-22
    • 2011-07-24
    • 2017-05-05
    相关资源
    最近更新 更多