SQLAlchemy中如何查询名称包含斜杠的列?
解决SQLAlchemy查询含特殊字符列名的问题
当列名包含斜杠这类特殊字符时,不能直接用.属性访问的方式(比如Table.c.Column/Name)——因为Python的属性标识符不允许包含/,这种写法会被解析成除法运算,完全偏离原意。你可以通过以下方式解决:
方法1:使用字典索引访问列
这是最直接有效的方式,直接通过键名索引引用含特殊字符的列:
query = select([ func.sum(Table.c.ColumnName), func.sum(Table.c['Column/Name']), # 用字典索引代替属性访问 ])
由于你是通过metadata.reflect自动反射表结构,SQLAlchemy已经正确读取了数据库中带斜杠的列名,只要用列名作为键去索引Table.c就能拿到对应的列对象。
方法2:反射时重命名列(可选)
如果不想每次都写字典索引,可以在反射表的时候给列重命名,修改map_table方法:
def map_table(self, table_name): table_full_name = f"{self.metadata.schema}.{table_name}" table = self.metadata.tables[table_full_name] # 遍历列,将含斜杠的列重命名为合法属性名 for col in table.columns: if '/' in col.name: col.key = col.name.replace('/', '_') # 把斜杠替换成下划线 return table
之后就可以用Table.c.Column_Name来访问原Column/Name列,但这种方式需要额外维护重命名规则,适合需要频繁访问该列的场景。
最后用pandas的read_sql_query正常执行查询即可,上述两种方法都能正确生成包含特殊列名的SQL语句。
内容的提问来源于stack exchange,提问作者overb
相关产品推荐
相关产品推荐

