如何用SQLAlchemy正确实现PostgreSQL带INCLUDE的函数索引?
解决SQLAlchemy生成PostgreSQL索引时f_unaccent参数被识别为字符串的问题
直接在索引定义里用SQLAlchemy的func和模型列对象构造表达式,而非传入字符串字面量,就能让SQLAlchemy正确生成目标SQL语句。
示例代码如下:
from sqlalchemy import Column, String, func from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.schema import Index Base = declarative_base() class FrSuggestStreetQuery(Base): __tablename__ = 'fr_suggest_street_query' street = Column(String) # 表的其他列定义... # 定义目标索引 __table_args__ = ( Index( 'idx_lu_suggest_street_query_street', func.lower(func.f_unaccent(street)), # 传入列对象而非字符串'street' postgresql_include=['street'] ), )
关键说明
func.f_unaccent(street)中,street是模型类的列对象,SQLAlchemy会将其解析为SQL里的列引用,而非字符串字面量,最终生成f_unaccent((street)::text)格式的语句。postgresql_include=["street"]保持不变,这里需要传入列名字符串,SQLAlchemy会正确识别处理。
生成的最终SQL语句与预期完全一致:
CREATE INDEX idx_lu_suggest_street_query_street ON fr_suggest_street_query (lower(f_unaccent(street))) INCLUDE (street);
内容的提问来源于stack exchange,提问作者Razvan
相关产品推荐
相关产品推荐

