SQLAlchemy 不同类型的列同义词

发布于 2025-01-02 06:55:48 字数 528 浏览 1 评论 0原文

我正在使用 SQLAlchemy 配方此处神奇地 JSON 编码/解码模型中数据库中的列,如下所示:

class Thing(Base):
    __tablename__ = 'things'
    id = Column(Integer(), primary_key=True)
    data = Column(JSONEncodedDict)

当我想在模型中创建额外的“raw_data”字段以访问相同的底层 JSON 数据但不对其进行编码/解码时,我遇到了障碍:

    raw_data = Column("data", VARCHAR)

SQLAlchemy似乎对名称冲突感到困惑,并留下一列未映射。有什么方法可以说服 SQLAlchemy 实际上将两个属性映射到同一列吗?

I'm using the SQLAlchemy recipe here to magically JSON encode/decode a column from the DB in my model like:

class Thing(Base):
    __tablename__ = 'things'
    id = Column(Integer(), primary_key=True)
    data = Column(JSONEncodedDict)

I hit a snag when I wanted to create an extra "raw_data" field in my model to access the same underlying JSON data, but without encoding/decoding it:

    raw_data = Column("data", VARCHAR)

SQLAlchemy seems to get confused by the name collision and leave one column un-mapped. Is there any way I can convince SQLAlchemy to actually map both attributes to the same column?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

老娘不死你永远是小三 2025-01-09 06:55:48

我只需通过 SQLAlchemy 定义 raw_data 列,然后使用 Python 的属性/设置器来透明地使用 data。 IE:

class Thing(Base):
    __tablename__ = 'things'
    id = Column(Integer(), primary_key=True)
    raw_data = Column(String())

    @property
    def data(self):
        # add some checking here too
        return json.loads(self.raw_data)

    @data.setter
    def data(self, value):
        # dito
        self.raw_data = json.dumps(value)

I would just define the raw_data column through SQLAlchemy and then use Python's property/setter to make transparent use of data. I.e.:

class Thing(Base):
    __tablename__ = 'things'
    id = Column(Integer(), primary_key=True)
    raw_data = Column(String())

    @property
    def data(self):
        # add some checking here too
        return json.loads(self.raw_data)

    @data.setter
    def data(self, value):
        # dito
        self.raw_data = json.dumps(value)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文