python - 用于添加索引的 SQLAlchemy/Alembic 原始 SQL

标签 python postgresql sqlalchemy alembic

我想使用以下原始 SQL 在 PostgreSQL 中创建索引:

CREATE INDEX ix_action_date ON events_map ((action ->> 'action'), date, map_id);

我试图将此行放入模型类的 __table_args__ 部分,但我做不到。然后我通过在 Alembic 迁移中使用原始 SQL 简单地解决了它。

conn = op.get_bind()
conn.execute(text("CREATE INDEX ..."))

并且只是在 __table_args__ 中使用虚拟索引,例如:

Index('ix_action_date')

我唯一的问题是 Alembic 不接受同名的虚拟索引,每次我运行 revision --autogenerate 时,它都会告诉我以下内容:

SAWarning: Skipped unsupported reflection of expression-based index ix_action_date
  % idx_name)

然后它将自动生成的索引添加到迁移文件中:

op.create_index('ix_action_date', 'events_map', [], unique=False)

我的问题是:

  1. 如何将原始 SQL 写入 __table_args__ 索引?

  2. 我怎样才能真正使我的虚拟索引概念发挥作用?我的意思是仅按名称进行比较的索引?

最佳答案

How can I write raw SQL into a __table_args__ Index?

要指定公式索引,您必须为表达式提供一个文本元素

例子:

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)

How can I really make my dummy index concept work ? I mean an index which is only compared by name?

似乎没有必要让你的虚拟索引概念起作用。如上所示,要么在 __table_args__ 中指定完整的索引表达式,要么在模型和委托(delegate)索引创建中完全省略它,作为由 sqlalchemy 处理的数据库迁移。

关于python - 用于添加索引的 SQLAlchemy/Alembic 原始 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51232401/

相关文章:

python - 如何将 csv 日期时间字符串保存到 Django 模型字段中

python - 注入(inject)python类进行测试,无需修改类

perl - 关于 DBD::Pg 的 AutoCommit,文档是否存在谎言?

sql - PostgreSQL 错误 : payload string too long

flask - 如何在 Flask-SqlAlchemy 中使用子查询?

python - 如何在 SQLAlchemy 中保存计算列?

python - 当文件被删除时,文件句柄会发生什么?

python - 从python中的长字符串中删除某些字符

ruby-on-rails - 您如何使用变量在 ruby​​ on rails 中查询 postgres 数组的整数?

python - 使用 sqlalchemy 防止现有 sqlite 表中出现重复条目