gpt4 book ai didi

python - 如何使用 SQLAlchemy TypeDecorator 向列添加方法

转载 作者:太空宇宙 更新时间:2023-11-04 00:19:43 25 4
gpt4 key购买 nike

我正在尝试向 ORM 类成员添加自定义方法,以使其处理与该成员相关的事情。试图跟随 documentation .

class EnhDateTime(types.TypeDecorator):
impl = types.DateTime
def foo(self):
return "foo"

class MyDoc(Base):
id = Column(Integer, primary_key=True, autoincrement=False)
created = Column(EnhDateTime)

doc = session.query(MyDoc).filter_by(id=123).one()

不幸的是什么也没发生,成员仍然是 DateTime 类型:

type(doc.created)

datetime.datetime

doc.created.foo()

AttributeError

最佳答案

TypeDecorator 不是类型,它只是装饰类型,即它定义了一些在某些情况下调用的方法,比如当一个值被传递到/从数据库时。您需要实现 process_bind_param()process_result_value() 这两个方法。在那里,您可以将数据库中的值转换为任何您想要的值。

例如,请参阅 TypeDecorator recipes section 中的 JSON 示例:

from sqlalchemy.types import TypeDecorator, VARCHAR
import json

class JSONEncodedDict(TypeDecorator):

impl = VARCHAR

def process_bind_param(self, value, dialect):
if value is not None:
value = json.dumps(value)

return value

def process_result_value(self, value, dialect):
if value is not None:
value = json.loads(value)
return value

例子:

from datetime import datetime
from sqlalchemy.types import TypeDecorator, DATETIME

class _EnhDateTime(datetime):

def foo(self):
return 'foo'


class EnhDateTime(TypeDecorator):

impl = DATETIME

def process_result_value(self, value, dialect):
if value is not None:
value = _EnhDateTime(
value.year, value.month, value.day, value.hour, value.minute,
value.second, value.microsecond, value.tzinfo
)
return value

我们不需要实现 process_bind_param() 因为 _EnhDateTime 实例 datetime 实例,所以DATETIME 的默认绑定(bind)处理器应该可以。

关于python - 如何使用 SQLAlchemy TypeDecorator 向列添加方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49652698/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com