Одной из возможностей является создание собственного расширения компиляции:
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)
)