如何在SQLAlchemy中引用以数字开头的列名?
解决SQLAlchemy访问数字开头列的问题
修复当前代码的语法错误
你碰到的invalid syntax是Python语法限制导致的——Python不允许通过.访问以数字开头的属性(比如cols.1st_party)。把属性访问改成字典索引方式就能解决:
# 替换原有的where条件行 qry = source.query(source_tbl).where(cols['1st_party'] == 'PARTY_NAME_GOES_HERE')
这是SQLAlchemy处理非常规列名的标准写法,不需要修改任何表结构。
无需定义表对象的查询方案
如果不想提前反射或定义表对象,推荐两种简便方式:
方式1:用text()直接编写原生SQL片段
适合快速实现查询,同时支持参数绑定避免SQL注入:
from sqlalchemy import text # 直接执行完整原生SQL results = source.execute( text('SELECT * FROM SCHEMA_GOES_HERE.TABLE_NAME_GOES_HERE WHERE "1st_party" = :party'), {"party": "PARTY_NAME_GOES_HERE"} ) # 或者结合ORM query使用text条件 qry = source.query(text("*")).select_from( text("SCHEMA_GOES_HERE.TABLE_NAME_GOES_HERE") ).where( text('"1st_party" = :party') ) results = source.execute(qry, {"party": "PARTY_NAME_GOES_HERE"})
注意:数字开头的列名在SQL中需要用双引号包裹(MySQL需替换为反引号),参数绑定:party`一定要用字典传递,不要直接拼接字符串。
方式2:用column()动态定义列
如果想保留ORM的类型特性,又不想反射表结构,可以直接用column()指定需要的列:
from sqlalchemy import column, select # 构造查询语句 stmt = select( column("1st_party"), column("department") # 添加你需要查询的其他列 ).select_from( text("SCHEMA_GOES_HERE.TABLE_NAME_GOES_HERE") ).where( column("1st_party") == "PARTY_NAME_GOES_HERE" ) results = source.execute(stmt)
内容的提问来源于stack exchange,提问作者Cilantro Ditrek
相关产品推荐
相关产品推荐

