如何在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
相关产品推荐
相关产品推荐

