Как добавить собственное расширение (диалект) в CREATE INDEX в Sqlalchemy? (sql хранение) - PullRequest
1 голос
/ 07 февраля 2020

У меня есть следующая декларативная схема Sqlalchemy:

class Locations(Base):
    __tablename__ = 'locations'
    group = Column(Integer, primary_key=True)
    id = Column(String, primary_key=True)
    shelf = Column(Integer, primary_key=True)
    start = Column(Integer, nullable=False)
    end = Column(Integer, nullable=False)

Я хотел бы создать следующий индекс:

CREATE INDEX ixloc ON locations (shelf, "end" DESC) storing (start);

Как я могу добавить это?

Хранение - это расширение CREATE INDEX CockroachDB, в котором данный столбец хранится в индексе для более быстрого поиска.

Я уже пробовал это без успеха:

Index.argument_for("cockroachdb", "storing", None)
Index('ixloc', Locations.shelf, Locations.end.desc(), cockroachdb_storing='start')

1 Ответ

2 голосов
/ 07 февраля 2020

Исходя из ответа Ильи, решение:

from sqlalchemy import Index
from sqlalchemy.schema import CreateIndex

Index.argument_for("cockroachdb", "storing", None)

@compiles(CreateIndex, "cockroachdb")
def compile_create_index(create, compiler, **kw):
    stmt = compiler.visit_create_index(create, **kw)
    cockroachdb_opts = create.element.dialect_options["cockroachdb"]
    storing = cockroachdb_opts.get("storing")

    if storing:
        child_cols = ", ".join([compiler.preparer.quote(c) for c in storing])
        stmt = stmt.rstrip()
        stmt = f"{stmt} STORING ({child_cols})\n\n"
    return stmt

Index('ixloc', Locations.shelf, Locations.end.desc(), cockroachdb_storing=['start'])
...