SQLAlchemy ORM 中的 Getter/setter 映射声明表

问题描述 投票:0回答:0

我想在分配给 SQLAlchemy 中的映射表对象期间将值更改为不同的格式,然后在选择行时对该列执行反向格式化。

想要

# Adds a row with a formatted start_time="20230301-120000"
my_table_row = MyTable(start_time="2023-03-01 12:00:00")
session.add(my_table_row)
session.flush()


# Returns a MyTable object with an inverse formatted start_time="2023-03-01 12:00:00"
result = session.execute(
    select(MyTable).filter_by(start_time="20230301-120000")
).scalar_one()

尝试过

我正在尝试根据

this
使用
@property
@attr.setter装饰器。但是,这些值是在没有任何格式更改的情况下从数据库中添加和检索的。

from sqlalchemy.orm import DeclarativeBase, mapped_column, Mapped
from sqlalchemy import Table, Column, Integer, String

class Base(DeclarativeBase):
    pass


class MyTable(Base):

    __table__ = "test_table"

    _start_time: Mapped[str] = mapped_column("start_time", String(23), nullable=True, index=True)

    @property
    def start_time(self):
        return convert_from_db_format(self._start_time)

    @start_time.setter
    def start_time(self, start_time):
        self._start_time = convert_to_db_format(start_time)

我在这里做错了什么?

setter
convert_to_db_format()
工作正常,但是当我添加
getter
convert_from_db_format()
时,它似乎在插入 DB 之前反转了设置器的效果。

python sqlalchemy orm python-decorators
© www.soinside.com 2019 - 2024. All rights reserved.