SQLAlchemy
The Database Toolkit for Python
Python 的数据库工具包
  • 首页
  • 特性
    • 理念声明
    • 特性概述
    • 用户评价
  • 新闻
  • 文档
    • 当前文档 (版本 2.0)

    • 按版本文档
    • 版本 2.1 (开发中)
    • 版本 2.0
    • 版本 1.4
    • 版本 1.3

    • 讲座和教程
    • 发布内容概述
  • 社区
    • 获取支持
    • 参与
    • 开发
    • 行为准则
    • Github
  • 下载
    • 下载
    • 当前发布系列 (2.0)
    • 维护版本 (1.4)
    • 开发访问
    • 许可证
    • 版本编号
    • 发布状态
发布版本: 2.0.39 当前版本 | 发布日期: 2025 年 3 月 11 日

SQLAlchemy 2.0 文档

SQLAlchemy 2.0 文档

当前版本

首页 | 下载此文档

常见问题解答

  • 安装
  • 连接 / 引擎
  • MetaData / Schema¶
    • 当我说 table.drop() / metadata.drop_all() 时,我的程序挂起了
    • SQLAlchemy 是否支持 ALTER TABLE、CREATE VIEW、CREATE TRIGGER、Schema 升级功能?
    • 如何按依赖顺序对 Table 对象进行排序?
    • 如何获取 CREATE TABLE/ DROP TABLE 输出为字符串?
    • 如何子类化 Table/Column 以提供某些行为/配置?
  • SQL 表达式
  • ORM 配置
  • 性能
  • 会话 / 查询
  • 第三方集成问题

项目版本

  • 2.0.39

首页 | 下载此文档

  • 上一篇: 连接 / 引擎
  • 下一篇: SQL 表达式
  • 上一级: 首页
    • 常见问题解答
  • 在此页上
    • MetaData / Schema
      • 当我说 table.drop() / metadata.drop_all() 时,我的程序挂起了
      • SQLAlchemy 是否支持 ALTER TABLE、CREATE VIEW、CREATE TRIGGER、Schema 升级功能?
      • 如何按依赖顺序对 Table 对象进行排序?
      • 如何获取 CREATE TABLE/ DROP TABLE 输出为字符串?
      • 如何子类化 Table/Column 以提供某些行为/配置?

MetaData / Schema¶

  • 当我说 table.drop() / metadata.drop_all() 时,我的程序挂起了

  • SQLAlchemy 是否支持 ALTER TABLE、CREATE VIEW、CREATE TRIGGER、Schema 升级功能?

  • 如何按依赖顺序对 Table 对象进行排序?

  • 如何获取 CREATE TABLE/ DROP TABLE 输出为字符串?

  • 如何子类化 Table/Column 以提供某些行为/配置?

当我说 table.drop() / metadata.drop_all() 时,我的程序挂起了¶

这通常对应于两种情况:1. 使用 PostgreSQL,它对表锁非常严格;2. 您仍然有一个连接处于打开状态,该连接包含表上的锁,并且与用于 DROP 语句的连接不同。 这是模式的最简化版本

connection = engine.connect()
result = connection.execute(mytable.select())

mytable.drop(engine)

上面,连接池连接仍然被检出;此外,上面的结果对象还维护到此连接的链接。 如果使用“隐式执行”,则结果将保持此连接打开,直到结果对象关闭或所有行都用尽。

调用 mytable.drop(engine) 尝试在从 Engine 获取的第二个连接上发出 DROP TABLE,这将导致锁定。

解决方案是在发出 DROP TABLE 之前关闭所有连接

connection = engine.connect()
result = connection.execute(mytable.select())

# fully read result sets
result.fetchall()

# close connections
connection.close()

# now locks are removed
mytable.drop(engine)

SQLAlchemy 是否支持 ALTER TABLE、CREATE VIEW、CREATE TRIGGER、Schema 升级功能?¶

SQLAlchemy 中没有直接提供通用的 ALTER 支持。 对于临时的特殊 DDL,可以使用 DDL 和相关构造。 有关此主题的讨论,请参阅 自定义 DDL。

更全面的选择是使用模式迁移工具,例如 Alembic 或 SQLAlchemy-Migrate; 有关此方面的讨论,请参阅 通过迁移更改数据库对象。

如何按依赖顺序对 Table 对象进行排序?¶

这可以通过 MetaData.sorted_tables 函数获得

metadata_obj = MetaData()
# ... add Table objects to metadata
ti = metadata_obj.sorted_tables
for t in ti:
    print(t)

如何获取 CREATE TABLE/ DROP TABLE 输出为字符串?¶

现代 SQLAlchemy 具有表示 DDL 操作的子句构造。 这些可以像任何其他 SQL 表达式一样呈现为字符串

from sqlalchemy.schema import CreateTable

print(CreateTable(mytable))

要获取特定于特定引擎的字符串

print(CreateTable(mytable).compile(engine))

还有一种特殊的 Engine 形式可通过 create_mock_engine() 获得,它允许使用此方法将整个元数据创建序列转储为字符串

from sqlalchemy import create_mock_engine


def dump(sql, *multiparams, **params):
    print(sql.compile(dialect=engine.dialect))


engine = create_mock_engine("postgresql+psycopg2://", dump)
metadata_obj.create_all(engine, checkfirst=False)

Alembic 工具还支持“离线”SQL 生成模式,该模式将数据库迁移呈现为 SQL 脚本。

如何子类化 Table/Column 以提供某些行为/配置?¶

Table 和 Column 不是直接子类化的好目标。 但是,有一些简单的方法可以使用创建函数来获得构造时的行为,以及使用附件事件获得与模式对象(例如约束约定或命名约定)之间链接相关的行为。 许多这些技术的示例可以在 命名约定 中看到。

上一篇: 连接 / 引擎 下一篇: SQL 表达式
© 版权 2007-2025,SQLAlchemy 作者和贡献者。

flambé! 龙和 炼金术士 图像设计由 Rotem Yaari 创建并慷慨捐赠。

使用 Sphinx 7.2.6 创建。 文档最后生成时间:2025 年 3 月 11 日星期二下午 02:40:17 EDT
Python

网站内容版权 © 归 SQLAlchemy 作者和贡献者所有。 SQLAlchemy 及其文档根据 MIT 许可证获得许可。

SQLAlchemy 是 Michael Bayer 的商标。 mike(&)zzzcomputing.com 保留所有权利。

网站由 zeekofile 生成,非常感谢 Blogofile 项目。

Mastodon Mastodon