使用sqlalchemy在mysql中存储Python3枚举

jslywgbw  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(451)

当我试图储存 Animals 带字段的对象 species 包含python Enum 对象 SpeciesType.Cat ,我得到错误
typeerror:类型为“visitabletype”的对象没有len()
存储python3的正确方法是什么 Enum 在mysql中使用sqlalchemy?


# 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:'插入动物(id,物种)值(%(id)s,%(物种)s)')][参数:[{'species':,'id':'kitty'}]]

0ejtzxu1

0ejtzxu11#

你的 enum 模型应该是python的子类 enum.Enum 您的模型列定义应该使用 sqlalchemy.Enum ```
class SpeciesType(enum.Enum):
...

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

xpszyzbs

xpszyzbs2#

看起来您正在创建 Animals 枚举两次,这意味着您将有两个恰好具有相同名称的不同枚举。
只定义一次,然后将其导入任何需要的地方。

相关问题