Python 用于添加索引的SQLAlchemy/Alembic原始SQL
我想使用以下原始SQL在PostgreSQL中创建索引:Python 用于添加索引的SQLAlchemy/Alembic原始SQL,python,postgresql,sqlalchemy,alembic,Python,Postgresql,Sqlalchemy,Alembic,我想使用以下原始SQL在PostgreSQL中创建索引: CREATE INDEX ix_action_date ON events_map ((action ->> 'action'), date, map_id); 我试图将这一行放入模型类的\uu表\u参数\uu部分,但我做不到。然后,我简单地通过在Alembic迁移中使用原始SQL解决了这个问题 conn = op.get_bind() conn.execute(text("CREATE INDEX ...")) 只需在\
CREATE INDEX ix_action_date ON events_map ((action ->> 'action'), date, map_id);
我试图将这一行放入模型类的\uu表\u参数\uu
部分,但我做不到。然后,我简单地通过在Alembic迁移中使用原始SQL解决了这个问题
conn = op.get_bind()
conn.execute(text("CREATE INDEX ..."))
只需在\uuuu table\u args\uuuu
中使用一个虚拟索引,如下所示:
Index('ix_action_date')
我唯一的问题是Alembic不接受同名的虚拟索引,每次我运行修订版--autogenerate
,它都会告诉我以下内容:
SAWarning: Skipped unsupported reflection of expression-based index ix_action_date
% idx_name)
然后将自动生成的索引添加到迁移文件中:
op.create_index('ix_action_date', 'events_map', [], unique=False)
我的问题是:
\u表\u参数\u
索引\u表\u参数\u
索引
要指定公式索引,必须为表达式提供文本元素
例如:
class EventsMap(Base):
__tablename__ = 'events_map'
__table_args__ = (Index('ix_action_date', text("(action->>'action'), date, map_id")),)
map_id = Column(Integer, primary_key=True)
date = Column(DateTime)
action = Column(JSONB)
我如何才能真正使我的虚拟索引概念起作用?我指的是只按名称比较的索引
似乎没有必要让虚拟索引概念起作用。如我上面所示,在
\uuuu table\u args\uuuu
中指定完整的索引表达式,或者将其作为sqlalchemy处理的数据库迁移从模型和委托索引创建中完全省略。您是否可以添加更多关于“我试图将这一行放入模型类的\uu table\u args\uuu
部分,但我做不到”的详细信息?这似乎是XY问题。我正在使用SQLAlchemy ORM。每个模型都在一个类中指定。该类上的table_args变量指定表的自定义属性,如索引。我想在表_args中声明我的索引。这更像是编辑您的问题,将您的声明性定义包含在失败的尝试中,以及它是如何失败的。如果您在迁移中使用原始SQL手动创建索引,您甚至不必在表args中使用索引
,更不用说“伪”索引了。您是对的,如果我从表args中删除索引,它似乎可以工作,我只需要接受:跳过了对每个--autogenerate
的基于表达式的索引的不受支持的反射。关于第一条注释,SQLA支持索引中的表达式,至少对Postgresql方言是这样,因此为json(b)创建了一个索引定义列表达式和其他表达式应该是可行的。