【问题标题】:Storing Python 3 Enum in MySQL using SQLAlchemy使用 SQLAlchemy 在 MySQL 中存储 Python 3 枚举
【发布时间】:2018-06-14 16:01:45
【问题描述】:

当我尝试使用包含 Python Enum 对象 SpeciesType.Cat 的字段 species 存储 Animals 对象时,我收到错误

TypeError: 'VisitableType' 类型的对象没有 len()

使用 SQLAlchemy 在 MySQL 中存储 Python 3 Enum 的正确方法是什么?

# SQLALCHEMY CODE ########################

from sqlalchemy import *
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class SpeciesType(Enum):
    Cat = 1
    Dog = 2


class Animals(Base):
    __tablename__ = 'animals'
    id  = Column(String(16), primary_key=True)
    species = Column(Enum(SpeciesType))


# REGULAR CODE ########################

import enum

class SpeciesType(enum.Enum):
    Cat = 1
    Dog = 2


class MyClass:
    @property
    def session(self):
        ....

    def insertToDB(self):
        kitty = Animals(id='kitty', species=SpeciesType.Cat)
        self.session.add(kitty)
        self.session.commit()

c = MyClass()
c.insertToDB()

更新

修复sqlalchemy.enum和Enum.enum之间的名称冲突后出现以下新错误。

sqlalchemy.exc.StatementError: (builtins.LookupError) "SpeciesType.Cat" 不在定义的枚举值中 [SQL: 'INSERT INTO animals (id, species) VALUES (%(id)s, %(species) s)'] [参数:[{'species': , 'id': 'kitty'}]]]

【问题讨论】:

  • 您确定enum.Enum 和sqlalchemy.Enum 之间没有名称冲突吗?
  • @univerio 修复了名称冲突,现在我得到一个无法解决的新错误sqlalchemy.exc.StatementError: (builtins.LookupError) "SpeciesType.Cat" is not among the defined enum values [SQL: 'INSERT INTO animals (id, species) VALUES (%(id)s, %(species)s)'] [parameters: [{'species': <SpeciesType.Cat: 1>, 'id': 'kitty'}]]。更新问题

标签: python mysql enums sqlalchemy python-3.6


【解决方案1】:

看起来您创建了两次 Animals 枚举,这意味着您将拥有两个恰好具有相同名称的不同枚举。

只定义一次,然后将它导入到其他任何你需要的地方。

【讨论】:

    【解决方案2】:

    您的 enum 模型应该是 Python 的 enum.Enum 的子类,并且您的模型列定义应该使用 sqlalchemy.Enum

    class SpeciesType(enum.Enum):
    ...
    
    class Animals(Base):
        ...
        species = Column(sqlalchemy.Enum(SpeciesType))
    

    【讨论】:

      猜你喜欢
      • 2010-09-20
      • 1970-01-01
      • 2022-12-15
      • 2015-10-02
      • 1970-01-01
      • 1970-01-01
      • 2016-07-08
      • 2016-11-10
      • 2017-05-06
      相关资源
      最近更新 更多