如何使用 Pony ORM 存储 Python 枚举?

2024-02-25

假设我在这里有这个简单的小 Pony ORM 映射。内置 Enum 类是从 Python 3.4 开始新增的,并向后移植到 2.7。

from enum import Enum

from pony.orm import Database, Required


class State(Enum):
    ready = 0
    running = 1
    errored = 2

if __name__ == '__main__':
    db = Database('sqlite', ':memory:', create_db=True)

    class StateTable(db.Entity):
        state = Required(State)

    db.generate_mapping(create_tables=True)

当我运行该程序时,会抛出错误。

TypeError: No database converter found for type <enum 'State'>

发生这种情况是因为 Pony 不支持映射枚举类型。当然,这里的解决方法是只存储 Enum 值,并在 Class StateTable 中提供 getter 来再次将值转换为 Enum。但这是乏味且容易出错的。我也可以使用另一个 ORM。如果这个问题变得太令人头疼的话,也许我会这么做。但如果可以的话,我宁愿继续和 Pony 在一起。

我宁愿创建一个数据库转换器来存储枚举,就像错误消息所暗示的那样。有谁知道如何做到这一点?

更新: 感谢 Ethan 的帮助,我想出了以下解决方案。

from enum import Enum

from pony.orm import Database, Required, db_session
from pony.orm.dbapiprovider import StrConverter


class State(Enum):
    ready = 0
    running = 1
    errored = 2

class EnumConverter(StrConverter):

    def validate(self, val):
        if not isinstance(val, Enum):
            raise ValueError('Must be an Enum.  Got {}'.format(type(val)))
        return val

    def py2sql(self, val):
        return val.name

    def sql2py(self, value):
        # Any enum type can be used, so py_type ensures the correct one is used to create the enum instance
        return self.py_type[value]

if __name__ == '__main__':
    db = Database('sqlite', ':memory:', create_db=True)

    # Register the type converter with the database
    db.provider.converter_classes.append((Enum, EnumConverter))

    class StateTable(db.Entity):
        state = Required(State)

    db.generate_mapping(create_tables=True)

    with db_session:
        s = StateTable(state=State.ready)
        print('Got {} from db'.format(s.state))

摘自一些随机邮件列表 https://mailman-mail5.webfaction.com/pipermail/ponyorm-list/2014-September/000125.html:

2.2.转换器方法

每个转换器类应定义以下方法:

class MySpecificConverter(Converter):

    def init(self, kwargs):
        # Override this method to process additional positional
        # and keyword arguments of the attribute

       if self.attr is not None:
            # self.attr.args can be analyzed here
            self.args = self.attr.args

        self.my_optional_argument = kwargs.pop("kwarg_name")
        # You should take all valid options from this kwargs
        # What is left in is regarded as unrecognized option

    def validate(self, val):
        # convert value to the necessary type (e.g. from string)
        # validate all necessary constraints (e.g. min/max bounds)
        return val

    def py2sql(self, val):
        # prepare the value (if necessary) to storing in the database
        return val

    def sql2py(self, value):
        # convert value (if necessary) after the reading from the db
        return val

    def sql_type(self):
        # generate corresponding SQL type, based on attribute options
        return "SOME_SQL_TYPE_DEFINITION"

您可以研究现有转换器的代码,看看这些方法是如何实现的 已实施。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Pony ORM 存储 Python 枚举? 的相关文章

随机推荐

  • C# REST webservice身份验证问题

    在我之前的问题中here https stackoverflow com questions 3812625 c problem authenticating webservice between two webapplications我在
  • 如何在 VBA (Excel) 中使用变量设置属性

    采取这个代码 With ActiveSheet Shapes AddShape msoShapeRectangle x y w h TextFrame Parent Line Visible False Parent Fill ForeCo
  • 通用类型的 ASP.NET MVC 显示模板

    我正在尝试使用模型 ListModel 作为通用列表模型 我想在页面输入 Html DisplayForModel 但是 MVC 无法正确找到模板文件 ListModel cshtml 对于通用模型来说 它的工作方式必须有所不同 我应该如何
  • C linux相当于windows QueryPerformanceCounter

    Linux 中是否有等效的 C 函数用于读取 CPU 计数器及其频率 我正在寻找类似于 QueryPerformanceCounter 函数的东西 该函数读取现代 CPU 中的 64 位计数器 clock gettime 2 http li
  • HttpURLConnection conn.getRequestProperty 返回 null

    我正在尝试将一些数据推送到 BED 的 URL MDS CS 当我在代码中设置一些请求标头并提交请求时 提交的请求标头设置为null 这是我的代码 HttpURLConnection conn HttpURLConnection url o
  • 如何实现 D3 比例让孩子继承父母的颜色并带有刻度?

    我有一个 D3 js 树 它对节点和链接应用了不同的颜色 颜色是硬编码的 nodeUpdate select circle attr r 10 style fill function d if d name Top Level return
  • 使用 https 克隆项目 gitlab 时出错

    当我尝试使用 Https 协议克隆我的 Gitlab 项目时遇到问题 使用 git 协议一切正常 错误 Cloning into test fatal https XXXX XXXX XXXX XXXX user name test git
  • javax.xml.stream 包可从多个模块访问:、java.xml

    我有编译错误 The package javax xml stream is accessible from more than one module
  • Perl 5.16 中的 qr 操作

    我正在尝试修复一个非常旧的脚本 该脚本试图找到一个字符串FILE DESC LIMIT在文本文件中并将其更改为其他内容 为此 我当前的脚本在 Perl 5 10 上运行良好 我发现它使用了正则表达式 qr FILE DESC LIMIT d
  • Kivy刷新布局(异步加载)

    我有一个 ListView 其中每个项目都有一个 AsyncImage 和一个标签 加载图像时 它会显示每个项目之间有间隙的布局 Item Item 当第一次交互发生时 发生滚动 布局刷新并且间隙消失 Item Item 我真的很想在图像加
  • 使用准备好的语句时出现“尚未允许属性访问”警告[重复]

    这个问题在这里已经有答案了 我正在尝试使用以下方式创建登录系统AES ENCRYPT 对我的密码进行编码 但我有一些警告xdebug当尝试实现这些代码时 key d0gis SUPER cute sql SELECT FROM users2
  • 在平滑滑块中选择幻灯片时禁用滑动

    我正在使用同步滑块 fullslide 一次一张幻灯片 thumbslide 一次 5 张幻灯片 用作全幻灯片的导航 从拇指幻灯片中选择一张幻灯片时 我希望它变为活动状态without向左或向中心滑动 有办法实现这一点吗 CODE slid
  • 如果在语句修饰符中声明变量,则发出警告

    我刚刚得到以下代码行 my foo bar if cond 我将解决这个问题 因为它当然会导致微妙的错误 https stackoverflow com a 5915308 1733163 是否有 Perl 版本 模块或编译指示在达到此类语
  • 一起部署多个应用程序

    我有两个应用程序配置为使用 capistrano 进行部署 它们单独部署都很好 但我想发布两个应用程序需要一起部署的版本 是否有解决方案可以将多个 capistrano 部署在一起并选择分支 我尝试过 caphub 但它对我不起作用 我明白
  • 从 Eclipse 推送到 Github 时出现“411 Length required”异常

    我正在 Eclipse 中为一个学校项目开发一个 Android 应用程序 并尝试推送到 Github 它工作了一段时间 然后突然开始告诉我 推送期间发生内部异常 http github com 我的用户名 repo name git 41
  • asp.net:response.redirect 不起作用

    我有一个 aspx 表单 其中有一个组合框 其中包含从数据库表检索的主题 提交按钮 单击该按钮可在网格视图中查看与该主题相关的问题 我通过在按钮单击事件中调用函数 FillGrid 来完成此操作 我还为我的 gridview 更改了 pag
  • 依赖于其他 slib 的静态库是否需要它们的实际“代码”才能工作?

    抱歉 问题标题含糊不清 我只是想确定一些事情 静态库不会与其他静态库链接 对吧 因此 当我编写一个 slib A 它使用另一个 B 的功能时 我所需要提供的只是 B 到 A 的标头 而且只有这些标头 即使 A 实际上使用了 B 的功能 是的
  • 后面代码中的计算

    司机服务费用为 30 美元 用户可以选择是否需要该服务 当他们已经选择汽车和租赁日期时 我将其存储在会话中 Session car1 Label1 Text Session price Label5 Text Session day Dro
  • 比较子列表并合并它们

    我有一个包含很多子列表的列表 这些子列表最初是数字对 所以它看起来像 list 2 3 4 5 7 8 8 9 11 12 14 15 15 16 16 17 17 18 18 19 20 21 我想要的是将子列表的最后一个数字与下一个子列
  • 如何使用 Pony ORM 存储 Python 枚举?

    假设我在这里有这个简单的小 Pony ORM 映射 内置 Enum 类是从 Python 3 4 开始新增的 并向后移植到 2 7 from enum import Enum from pony orm import Database Re