You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中通过Prisma将字符串插入PostgreSQL枚举字段

问题

尝试在Python中通过Prisma将字符串类型数据插入PostgreSQL数据库,数据库字段在Prisma Schema中定义为枚举类型,通过字符串映射插入时失败,提示不支持字符串类型。

代码示例

from enum import Enum
from prisma import Prisma
import os
import logging

db = Prisma()
os.environ['DATABASE_URL'] = ''
db.connect()

class DifficultyLevel(Enum):
    EASY = 'EASY'
    MEDIUM = 'MEDIUM'
    HARD = 'HARD'
    LUCK = 'LUCK'

def map_question_difficulty(generated_difficulty):
    difficulty_mapping = {
        'Easy': DifficultyLevel.EASY,
        'Medium': DifficultyLevel.MEDIUM,
        'Hard': DifficultyLevel.HARD,
        'LUCK': DifficultyLevel.LUCK
    }
    return difficulty_mapping.get(generated_difficulty, DifficultyLevel.EASY).value  # Default to EASY if difficulty not found

async def insert_questions_to_db(questions):
    try:
        for question in questions:
            db.elementgenerated.create(
                data={
                    "difficulty": map_question_difficulty(question['difficulty'])
                }
            )
        logging.info(f"Successfully inserted {len(questions)} questions into the database.")
    except Exception as e:
        logging.error(f"Error inserting questions into the database: {e}")
        raise

Prisma Schema枚举定义

enum DifficultyLevel {
  EASY
  MEDIUM
  HARD
}

错误信息

prisma.errors.DataError: Error converting field "difficulty" of expected non-nullable type "String", found incompatible value of "EASY".

其中question['difficulty']是'Easy'、'Medium'或'Hard'这类字符串。


解决方法

1. 核心修复:使用Prisma自动生成的枚举类

Prisma会根据Schema中的枚举定义自动生成对应的Python枚举类,无需手动定义。直接导入使用即可保证类型完全匹配。

修改后的完整代码:

from prisma import Prisma
import os
import logging
from prisma.enums import DifficultyLevel  # 导入Prisma自动生成的枚举

db = Prisma()
os.environ['DATABASE_URL'] = ''
db.connect()

def map_question_difficulty(generated_difficulty):
    difficulty_mapping = {
        'Easy': DifficultyLevel.EASY,
        'Medium': DifficultyLevel.MEDIUM,
        'Hard': DifficultyLevel.HARD,
        # 移除Schema中不存在的LUCK条目,避免插入报错
    }
    return difficulty_mapping.get(generated_difficulty, DifficultyLevel.EASY)  # 直接返回枚举实例,不要取.value

async def insert_questions_to_db(questions):
    try:
        for question in questions:
            await db.elementgenerated.create(  # 异步方法必须加await
                data={
                    "difficulty": map_question_difficulty(question['difficulty'])
                }
            )
        logging.info(f"Successfully inserted {len(questions)} questions into the database.")
    except Exception as e:
        logging.error(f"Error inserting questions into the database: {e}")
        raise

2. 关键修复点说明

  • 删除自定义枚举:手动定义的枚举与Prisma生成的类型不兼容,直接用prisma.enums下的类即可。
  • 不要取.value:Prisma期望接收枚举实例而非字符串值,直接传入枚举成员(如DifficultyLevel.EASY)即可。
  • 添加await:create()是异步方法,必须用await触发执行,否则不会实际操作数据库。
  • 同步枚举值:Schema中没有LUCK枚举,需从映射字典中移除该条目,避免插入时出现枚举值不存在的错误。

3. 可选方案:直接映射字符串(无需枚举类)

如果不想导入枚举类,也可以直接传入与Schema枚举值完全匹配的字符串(注意大小写一致):

def map_question_difficulty(generated_difficulty):
    difficulty_mapping = {
        'Easy': 'EASY',
        'Medium': 'MEDIUM',
        'Hard': 'HARD',
    }
    return difficulty_mapping.get(generated_difficulty, 'EASY')

这种方式需严格保证字符串与Schema枚举值的大小写、拼写完全一致。


内容的提问来源于stack exchange,提问作者Jerry Chen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 07:20:15