python - 为 SQLAlchemy 表提供自定义参数
问题描述
我想使用来自 SQLAlchemy 的 CockroachDB 的 Column Families declarative_base
。我想我需要将它添加到__table_args__
,但我不知道如何。
问题基本上是:是否可以从 SQLAlchemy 为 CREATE TABLE 提供自定义(底层方言不支持)选项?
解决方案
One possibility is to create a custom compilation extension:
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})"
With the extension the following:
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__))
outputs:
CREATE TABLE test (
id INTEGER NOT NULL,
x INTEGER,
PRIMARY KEY (id),
FAMILY xs (x)
)
推荐阅读
- http - 尝试从已解析的原始 HTTP 请求发送请求时出现意外的 EOF
- jwt - PyJWT 在云服务器上运行时引发 jwt.InvalidToken
- python - Django - 用于同时更新多个对象之间的多个关系的表格形式
- wordpress - WooCommerce 在分类/属性片段中搜索 - 完全匹配问题
- css - 需要帮助清理 SVG 动画
- javascript - 从 .length() 中删除特定子项
- javascript - 如何更改 Javascript 以便 DOM 脚本也加载外部 Javascript?
- javascript - 弹出 HTML 警报后关闭模态窗口
- groovy - 从 Jenkins 管道将文件上传到 Nexus 不起作用
- angular - 在页面顶部添加通知栏