如何获取SQLAlchemy 2.0中设为index=True的列对应的Index对象
解决SQLAlchemy 2.0获取列对应索引的问题
一、获取关联的Index对象
用mapped_column(index=True)定义列时,SQLAlchemy会自动生成匿名索引,存放在表的__table__.indexes集合里。遍历这个集合,就能找到和目标列绑定的索引:
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column class Base(DeclarativeBase): pass class MyTable(Base): __tablename__ = "my_table" id: Mapped[int] = mapped_column(primary_key=True) name: Mapped[str] = mapped_column(index=True) # 找到name列对应的Index对象 name_index = next(idx for idx in MyTable.__table__.indexes if MyTable.name in idx.columns) # 批量插入流程:删索引→插数据→建索引 with engine.begin() as conn: name_index.drop(conn) # 执行批量插入 conn.execute(MyTable.__table__.insert(), [{"name": "foo"}, {"name": "bar"}]) name_index.create(conn)
二、直接获取索引名称(用原生SQL操作)
如果不想拿Index对象,只想获取索引名称来执行原生SQL,同样遍历索引集合取出idx.name就行:
# 获取name列的索引名称 name_index_name = next(idx.name for idx in MyTable.__table__.indexes if MyTable.name in idx.columns) # 用原生SQL操作索引 with engine.begin() as conn: conn.execute(text(f"DROP INDEX {name_index_name}")) # 批量插入操作 conn.execute(MyTable.__table__.insert(), [{"name": "foo"}, {"name": "bar"}]) conn.execute(text(f"CREATE INDEX {name_index_name} ON my_table(name)"))
注意:如果是多列复合索引,要调整判断条件,确保匹配到正确的索引。
三、自定义索引名称(更省心)
嫌自动生成的索引名称不好记?定义列时可以显式指定索引名称,或者直接创建Index对象关联列,后续操作更直接:
# 方式1:通过mapped_column的info参数指定 name: Mapped[str] = mapped_column(index=True, info={"index_name": "my_table_name_idx"}) # 方式2:显式创建Index对象 from sqlalchemy import Index class MyTable(Base): __tablename__ = "my_table" id: Mapped[int] = mapped_column(primary_key=True) name: Mapped[str] = mapped_column() __table_args__ = ( Index("my_table_name_idx", "name"), ) # 直接通过名称获取索引 name_index = MyTable.__table__.indexes["my_table_name_idx"]
内容的提问来源于stack exchange,提问作者Roméo Desprès
相关产品推荐
相关产品推荐

