Предоставление пользовательских аргументов в таблицу SQLAlchemy - PullRequest
0 голосов
/ 20 февраля 2019

Я хотел бы использовать семейства столбцов CockroachDB из SQLAlchemy declarative_base.Я думаю, мне нужно добавить это к __table_args__, но я не могу понять, как.

Вопрос в основном заключается в следующем: можно ли задать пользовательские (не поддерживаемые основным диалектом) параметры для CREATE TABLEиз SQLAlchemy?

1 Ответ

0 голосов
/ 20 февраля 2019

Одной из возможностей является создание собственного расширения компиляции:

from sqlalchemy.ext.compiler import compiles
from sqlalchemy.schema import ColumnCollectionConstraint
from sqlalchemy.sql.elements import quoted_name


class Family(ColumnCollectionConstraint):

    def __init__(self, name, *columns, **kwgs):
        name = quoted_name(name, kwgs.pop("quote", None))
        super().__init__(*columns, **kwgs)
        self.name = name


@compiles(Family)
def compile_family(element, ddlcompiler, **kwgs):
    name = ddlcompiler.preparer.quote(element.name)
    columns = ", ".join([
        ddlcompiler.sql_compiler.process(col, include_table=False, **kwgs)
        for col in element.columns
    ])
    return f"FAMILY {name} ({columns})"

С расширением:

from sqlalchemy import Column, Integer
from sqlalchemy.schema import CreateTable
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class Test(Base):
    __tablename__ = 'test'
    id = Column(Integer, primary_key=True)
    x = Column(Integer)
    __table_args__ = (Family('xs', x),)

print(CreateTable(Test.__table__))

вывод:

CREATE TABLE test (
        id INTEGER NOT NULL, 
        x INTEGER, 
        PRIMARY KEY (id), 
        FAMILY xs (x)
)
...