Python 为SQLAlchemy表提供自定义参数

Python 为SQLAlchemy表提供自定义参数,python,sqlalchemy,cockroachdb,Python,Sqlalchemy,Cockroachdb,我想使用SQLAlchemydeclarative_base中的CockroachDB列族。 我想我需要把这个添加到\uuu table\u args\uuuu,但我不知道如何添加 问题基本上是:是否可以提供自定义(底层方言不支持)选项以从SQLAlchemy创建表?一种可能是创建自定义编译扩展: from sqlalchemy.ext.compiler import compiles from sqlalchemy.schema import ColumnCollectionConstrain

我想使用SQLAlchemy
declarative_base
中的CockroachDB列族。 我想我需要把这个添加到
\uuu table\u args\uuuu
,但我不知道如何添加


问题基本上是:是否可以提供自定义(底层方言不支持)选项以从SQLAlchemy创建表?

一种可能是创建自定义编译扩展:

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__))
产出:

创建表测试(
id整数不为空,
x整数,
主键(id),
家庭xs(x)
)