SQLAlchemy查询数据库表时提示表未定义该如何处理?
问题原因及解决方案
- 元数据未绑定表结构,也未反射数据库现有表
你实例化的MetaData()是空对象,没有和你要查询的表做绑定,也没有从数据库同步已存在的表结构,SQLAlchemy无法识别你传入的name_of_my_table对应的数据库表,因此抛出未定义错误。
解决有两种可选方案:- 手动定义表结构,将元数据实例传入构造参数:
from sqlalchemy import Table, Column, Integer, String # 字段定义要和数据库中实际表结构完全一致 name_of_my_table = Table( "实际数据库中的表名", metadata, Column("id", Integer, primary_key=True), Column("其他字段名", String) )- 自动反射数据库已有的表结构到元数据中:
# 绑定数据库连接,反射当前库所有表结构 metadata.reflect(bind=engine) # 反射完成后通过表名获取对应表对象 name_of_my_table = metadata.tables["实际数据库中的表名"] - 表所属schema不匹配
PostgreSQL默认使用publicschema,如果你要查询的表存放在自定义schema下,定义表或者反射时没有指定schema参数,也会识别不到表。
解决方法:操作时指定schema参数:
# 手动定义表时指定schema name_of_my_table = Table("表名", metadata, Column(...), schema="自定义schema名") # 反射时指定schema metadata.reflect(bind=engine, schema="自定义schema名") # 反射后获取表的格式为 schema名.表名 name_of_my_table = metadata.tables["自定义schema名.表名"]
- 表名大小写不匹配
PostgreSQL默认会把未加引号的SQL标识符转为小写,如果你建表时使用了带双引号的大写表名(比如CREATE TABLE "UserInfo" (...)),你反射或者定义表时的表名必须和建表时的大小写完全一致,否则会无法匹配到表。 - 连接权限/环境不匹配
确认当前engine连接的数据库实例、库名和表实际存在的环境一致,同时确认连接使用的数据库账号拥有该表的查询权限。
内容的提问来源于stack exchange,提问作者Chicken Sandwich No Pickles
相关产品推荐
相关产品推荐

