You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQLAlchemy新手求助:遇RemovedIn20警告及Connection关闭错误

问题修复方案

1. 解决RemovedIn20警告

警告来自两处不符合SQLAlchemy 2.0规范的写法:

  • MetaData初始化方式:直接传入Engine已被弃用,改为无参初始化即可
  • ForeignKey引用错误:你用了Python变量名(如artist_table.ArtistId),但ForeignKey需要引用数据库中实际的表名+列名(如"Artist.ArtistId")

2. 解决ResourceClosedError错误

错误原因是with块结束后连接会自动关闭,而你在块外执行查询操作。必须将查询执行、结果遍历的代码全部放在with块内部,确保连接处于活跃状态。

修正后的完整代码

from sqlalchemy import (
    create_engine, Table, Column, Float, ForeignKey, Integer, String, MetaData
)

# 初始化引擎,启用future模式适配2.0
db = create_engine("postgresql:///chinook", future=True)

# 修正MetaData初始化方式
meta = MetaData()

# Artist表定义
artist_table = Table(
    "Artist", meta,
    Column("ArtistId", Integer, primary_key=True),
    Column("Name", String)
)

# Album表定义,修正ForeignKey引用
album_table = Table(
    "Album", meta,
    Column("AlbumId", Integer, primary_key=True),
    Column("Title", String),
    Column("ArtistId", Integer, ForeignKey("Artist.ArtistId"))
)

# Track表定义,修正ForeignKey引用
track_table = Table(
    "Track", meta,
    Column("TrackId", Integer, primary_key=True),
    Column("Name", String),
    Column("AlbumId", Integer, ForeignKey("Album.AlbumId")),
    Column("MediaTypeId", Integer),
    Column("GenreId", Integer),
    Column("Composer", String),
    Column("Milliseconds", Integer),
    Column("Bytes", Integer),
    Column("UnitPrice", Float)
)

# 连接数据库并执行查询,所有操作放在with块内
with db.connect() as connection:
    # 构建查询
    select_query = artist_table.select()
    # 执行查询并遍历结果
    results = connection.execute(select_query)
    for result in results:
        print(result)

额外说明

  • 去掉了primary_key=False的冗余写法,因为Column默认就是非主键
  • 启用future=True后,建议严格遵循SQLAlchemy 2.0的API规范,避免使用已弃用特性

内容的提问来源于stack exchange,提问作者Savy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 00:53:11