繁体   English   中英

如何使用 SQLAlchemy TypeDecorators 编译原始 SQL

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM