用于自定义类型的 python sqlite3 适配器

标签 python enums sqlite

我正在使用 sqlite3用于 python 模块中的数据库访问。

我经常使用 enums在我的 python 对象中。目前,我必须先将我的枚举转换为字符串,然后再将它们插入到 sqlite 数据库中。我以下尝试注册通用适配器以使此转换隐式失败。

def adapt_enum(enum_instance):
    return enum_instance.name

sqlite3.register_adapter(enum.Enum,adapt_enum)

上述实现导致以下错误。

sqlite3.InterfaceError: Error binding parameter 5 - probably unsupported type.

为每个枚举注册一个适配器,如下所示工作正常

class MyEnum(Enum):
    a = 1
    b = 2

def adapt_my_enum(my_enum_instance):
    return my_enum_instance.name

sqlite3.register_adapter(MyEnum,adapt_my_enum)

MyEnum 的适配器按预期工作。但是这样做我必须分别为我的所有枚举注册一个适配器。有没有办法消除这种冗余?

附言我正在使用 python 2.7

最佳答案

看起来更简单的方法是 build the adaptation进入 Enum 本身:

class SqliteEnum(enum.Enum):
    def __conform__(self, protocol):
        if protocol is sqlite3.PrepareProtocol:
            return self.name

然后使用 SqliteEnum 作为其他枚举类的基础。

关于用于自定义类型的 python sqlite3 适配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33524327/

相关文章:

python - 如何将我的 epd python 作为我在 ubuntu 中的默认 python?

python - 如何智能地将 DRY 原则应用到 tkinter OptionMenu 中?

在位域整数与结构之间选择?

java - 在java中以Enum方式将整数值存储为常量

android - android中sqlite中的求和查询

sql - 使用重复的顺序值填充SQL数据库列

python - 为什么 Tor 无法访问本地主机页面

java - 枚举方法的通用返回类型

android - 什么时候在非 Activity 类中调用 onCreate()?

python - Django:规范化用户提交的模型数据以在模板中显示