首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用SQLAlchemy TypeDecorators编译原始SQL

如何使用SQLAlchemy TypeDecorators编译原始SQL
EN

Stack Overflow用户
提问于 2019-01-21 06:37:22
回答 1查看 869关注 0票数 2

我有一个SqlAlchemy查询对象,它使用uuid.UUID

代码语言:javascript
复制
import uuid
import sqlalchemy

foreign_uuid = '822965bb-c67e-47ee-ad12-a3b060ef79ae'
qry = Query(MyModel).filter(MyOtherModel.uuid == uuid.UUID(foreign_uuid))

现在,我想从SQLAlchemy获得原始postgresql:

代码语言:javascript
复制
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提供一个:

代码语言:javascript
复制
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呼叫?

EN

回答 1

Stack Overflow用户

发布于 2021-05-26 16:35:00

使用修饰类型作为列类型。另一组文档更清楚地解释了它:https://docs.sqlalchemy.org/en/14/faq/sqlexpressions.html#faq-sql-expression-string

代码语言:javascript
复制
   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()))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54284604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档