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
相关产品推荐
相关产品推荐

