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

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[]
}

执行以下步骤:

  1. 运行yarn rw prisma migrate dev(若模型刚创建未迁移,可直接修改后执行生成命令)
  2. 重新生成SDL:yarn rw g sdl editorialCalendar

此时生成器会自动将单数模型名复数化为editorialCalendars,与你原本的表名匹配,不会再出现冲突。

方案二:手动创建SDL和Service文件

若不想修改模型名,可绕过生成器,手动创建所需文件:

  1. 创建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
  }
`
  1. 创建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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 09:07:40