RedwoodJS执行sdl生成命令报错:标识符已被声明
解决RedwoodJS生成SDL时的复数化冲突问题
问题原因
RedwoodJS的代码生成器会自动对模型名做复数化处理,但你的Prisma模型名editorialCalendars本身已是复数,生成器错误地再次添加复数后缀,导致出现editorialCalendarses这种不合理的复数形式,进而引发标识符重复声明的报错。
解决方案
方案一:修改Prisma模型为单数形式(推荐)
遵循Prisma最佳实践,将模型名改为单数,同时统一模型关联的命名规范(首字母大写):
修改后的Prisma模型:
model EditorialCalendar { id Int @id @default(autoincrement()) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @default(now()) allSubjects String active Boolean team Team? @relation(fields: [teamId], references: [id]) teamId Int? subjects Subject[] }
执行以下步骤:
- 运行
yarn rw prisma migrate dev(若模型刚创建未迁移,可直接修改后执行生成命令) - 重新生成SDL:
yarn rw g sdl editorialCalendar
此时生成器会自动将单数模型名复数化为editorialCalendars,与你原本的表名匹配,不会再出现冲突。
方案二:手动创建SDL和Service文件
若不想修改模型名,可绕过生成器,手动创建所需文件:
- 创建
api/src/graphql/editorialCalendars.sdl.ts:
export const schema = gql` type EditorialCalendar { id: Int! createdAt: DateTime! updatedAt: DateTime! allSubjects: String! active: Boolean! team: Team teamId: Int subjects: [Subject!]! } type Query { editorialCalendars: [EditorialCalendar!]! @requireAuth editorialCalendar(id: Int!): EditorialCalendar @requireAuth } input CreateEditorialCalendarInput { allSubjects: String! active: Boolean! teamId: Int } input UpdateEditorialCalendarInput { allSubjects: String active: Boolean teamId: Int } type Mutation { createEditorialCalendar(input: CreateEditorialCalendarInput!): EditorialCalendar! @requireAuth updateEditorialCalendar(id: Int!, input: UpdateEditorialCalendarInput!): EditorialCalendar! @requireAuth deleteEditorialCalendar(id: Int!): EditorialCalendar! @requireAuth } `
- 创建
api/src/services/editorialCalendars/editorialCalendars.ts:
import { db } from 'src/lib/db' export const editorialCalendars = () => { return db.editorialCalendars.findMany() } export const editorialCalendar = ({ id }) => { return db.editorialCalendars.findUnique({ where: { id }, }) } export const createEditorialCalendar = ({ input }) => { return db.editorialCalendars.create({ data: input, }) } export const updateEditorialCalendar = ({ id, input }) => { return db.editorialCalendars.update({ data: input, where: { id }, }) } export const deleteEditorialCalendar = ({ id }) => { return db.editorialCalendars.delete({ where: { id }, }) }
完成后即可正常使用基于该模型的表单功能。
内容的提问来源于stack exchange,提问作者Nicolas Chusseau
相关产品推荐
相关产品推荐

