[英]How to use SQLAlchemy TypeDecorators to compile raw SQL
我有一个使用uuid.UUID
的 SqlAlchemy Query 对象:
import uuid
import sqlalchemy
foreign_uuid = '822965bb-c67e-47ee-ad12-a3b060ef79ae'
qry = Query(MyModel).filter(MyOtherModel.uuid == uuid.UUID(foreign_uuid))
现在我想从 SQLAlchemy 获取原始 postgresql:
qry.statement.compile(dialect=postgresql.dialect(), compile_kwargs={"literal_binds": True}))
这给出了以下错误: NotImplementedError: Don't know how to literal-quote value UUID('822965bb-c67e-47ee-ad12-a3b060ef79ae')
这似乎是因为 SqlAlchemy 只知道如何处理基本类型。 该文档建议使用TypeDecorator
,甚至为 GUID 提供了一个:
from sqlalchemy.dialects.postgresql import UUID
import uuid
class GUID(TypeDecorator):
"""Platform-independent GUID type.
Uses PostgreSQL's UUID type, otherwise uses
CHAR(32), storing as stringified hex values.
"""
impl = CHAR
def load_dialect_impl(self, dialect):
if dialect.name == 'postgresql':
return dialect.type_descriptor(UUID())
else:
return dialect.type_descriptor(CHAR(32))
def process_bind_param(self, value, dialect):
if value is None:
return value
elif dialect.name == 'postgresql':
return str(value)
else:
if not isinstance(value, uuid.UUID):
return "%.32x" % uuid.UUID(value).int
else:
# hexstring
return "%.32x" % value.int
def process_result_value(self, value, dialect):
if value is None:
return value
else:
if not isinstance(value, uuid.UUID):
value = uuid.UUID(value)
return value
但是它没有说明如何使用这个TypeDecorator
。 我需要在我的模型中以某种方式引用它吗? 我是否以某种方式使其可用于.statement.compile
调用?
您使用装饰类型作为列类型。 另一组文档更清楚地解释了它: https : //docs.sqlalchemy.org/en/14/faq/sqlexpressions.html#faq-sql-expression-string
from sqlalchemy import TypeDecorator, Integer
class MyFancyType(TypeDecorator):
impl = Integer
def process_literal_param(self, value, dialect):
return "my_fancy_formatting(%s)" % value
from sqlalchemy import Table, Column, MetaData
tab = Table('mytable', MetaData(), Column('x', MyFancyType()))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.