mickhansen / graphql-sequelize

GraphQL & Relay for MySQL & Postgres via Sequelize
MIT License
1.9k stars 172 forks source link

7.0.0: Unknown column 'Message.orderBy' in 'where clause' #570

Closed intellix closed 4 years ago

intellix commented 6 years ago

After updating to 7.0.0 and testing how to add dataloader, I'm seeing an orderBy being added to the WHERE clause of my query. I've not manually declared one and am not using one explicitly:

Versions

sequelize@4.28.5
sequelize-typescript@0.6.1
graphql-sequelize@7.0.0

Model

@Table
export class Message extends Model<Message> {
  @PrimaryKey
  @AutoIncrement
  @Column
  public id: number;

  @CreatedAt public createdAt: Date;
  @UpdatedAt public updatedAt: Date;
  @DeletedAt public deletedAt: Date;

  @Length({ min: 1, max: 255 })
  @Column({
    comment: 'Channel to post the message in (For example: EN)',
  })
  public channel: string;

  @Length({ min: 1, max: 255 })
  @Column
  public body: string;

  @ForeignKey(() => User)
  @Column
  public userId: number;

  @BelongsTo(() => User)
  public user: User;
}

Types

export const MessageConnectionType: any = sequelizeConnection({
  name: 'MessageConnection',
  nodeType: MessageType,
  target: () => Message,
  connectionFields: {
    total: {
      type: GraphQLInt,
      resolve: ({ fullCount }: { fullCount: number }) => (fullCount ? fullCount : Message.count()),
    },
  },
  where: (key: string, value: any, currentWhere: any) => ({ [key]: value }),
});

export const MessageType = new GraphQLObjectType({
  name: Message.name,
  description: '',
  fields: () => ({
    ...attributeFields(Message, {
      globalId: true,
      commentToDescription: true,
    }),
    userId: {
      type: GraphQLID,
      resolve: (source) => toGlobalId('User', source.userId),
    },
    user: {
      type: UserType,
      description: 'User who sent the message',
      resolve: resolver(Message.associations.user),
    },
  }),
  interfaces: [nodeInterface],
});

const Query = new GraphQLObjectType({
  name: 'Query',
  fields: () => ({
    node: nodeField,
    message: {
      type: MessageType,
      args: {
        id: {
          type: new GraphQLNonNull(GraphQLID),
        },
      },
      resolve: (source: any, args: any, context: Context, info: any) => {
        args.id = fromGlobalId(args.id).id;
        return resolver(Message)(source, args, context, info);
      },
    },
    messages: {
      type: MessageConnectionType.connectionType,
      args: {
        ...MessageConnectionType.connectionArgs,
        channel: {
          type: GraphQLString,
        },
      },
      resolve: MessageConnectionType.resolve,
    },
});

GQL Query:

{
  messages(first: 3) {
    edges {
      node {
        id
        body
      }
    }
  }
}

Executed query and stacktrace:

Executing (default): 
 SELECT `id`, `channel`, `body`, `userId`, `createdAt`, `updatedAt`, `deletedAt` 
 FROM `Message` AS `Message` 
 WHERE ((`Message`.`deletedAt` > '2018-02-24 11:13:49' OR `Message`.`deletedAt` IS NULL) 
 AND `Message`.`orderBy` IN ('id','ASC')) 
 ORDER BY `Message`.`id` ASC LIMIT 3;

SequelizeDatabaseError: Unknown column 'Message.orderBy' in 'where clause'
    at Query.formatError (/Users/dominicwatson/Sites/github/my-api/node_modules/sequelize/lib/dialects/mysql/query.js:228:16)
    at Query.connection.query [as onResult] (/Users/dominicwatson/Sites/github/my-api/node_modules/sequelize/lib/dialects/mysql/query.js:55:23)
    at Query.Command.execute (/Users/dominicwatson/Sites/github/my-api/node_modules/mysql2/lib/commands/command.js:30:12)
    at Connection.handlePacket (/Users/dominicwatson/Sites/github/my-api/node_modules/mysql2/lib/connection.js:515:28)
    at PacketParser.onPacket (/Users/dominicwatson/Sites/github/my-api/node_modules/mysql2/lib/connection.js:94:16)
    at PacketParser.executeStart (/Users/dominicwatson/Sites/github/my-api/node_modules/mysql2/lib/packet_parser.js:77:14)
    at Socket.<anonymous> (/Users/dominicwatson/Sites/github/my-api/node_modules/mysql2/lib/connection.js:102:29)
    at emitOne (events.js:116:13)
    at Socket.emit (events.js:211:7)
    at addChunk (_stream_readable.js:263:12)
    at readableAddChunk (_stream_readable.js:250:11)
    at Socket.Readable.push (_stream_readable.js:208:10)
    at TCP.onread (net.js:594:20)

Manually adding an orderBy

An attempt to manually add an orderBy to the MessageConnectionType like so:

orderBy: new GraphQLEnumType({
  name: 'MessageOrderBy',
  values: {
    ID: {value: ['id', 'ASC']},
  },
}),

Gives a new error which looks like it relates to https://github.com/mickhansen/graphql-sequelize/issues/569:

Executing (default): 
 SELECT `id`, `channel`, `body`, `userId`, `createdAt`, `updatedAt`, `deletedAt` 
 FROM `Message` AS `Message` 
 WHERE (`Message`.`deletedAt` > '2018-02-24 11:34:13' OR `Message`.`deletedAt` IS NULL) 
 ORDER BY `Message`.`id` ASC LIMIT 3;

TypeError: Cannot read property 'primaryKeyAttribute' of undefined
    at toCursor (/Users/dominicwatson/Sites/github/my-api/node_modules/graphql-sequelize/lib/relay.js:176:34)
    at resolveEdge (/Users/dominicwatson/Sites/github/my-api/node_modules/graphql-sequelize/lib/relay.js:228:15)
    at /Users/dominicwatson/Sites/github/my-api/node_modules/graphql-sequelize/lib/relay.js:301:18
    at Array.map (<anonymous>)
    at Object.<anonymous> (/Users/dominicwatson/Sites/github/my-api/node_modules/graphql-sequelize/lib/relay.js:300:28)
    at Generator.next (<anonymous>)
    at Generator.tryCatcher (/Users/dominicwatson/Sites/github/my-api/node_modules/bluebird/js/release/util.js:16:23)
    at PromiseSpawn._promiseFulfilled (/Users/dominicwatson/Sites/github/my-api/node_modules/bluebird/js/release/generators.js:97:49)
    at Object.<anonymous> (/Users/dominicwatson/Sites/github/my-api/node_modules/bluebird/js/release/generators.js:201:15)
    at Object.after (/Users/dominicwatson/Sites/github/my-api/node_modules/graphql-sequelize/lib/relay.js:366:22)
    at /Users/dominicwatson/Sites/github/my-api/node_modules/graphql-sequelize/lib/resolver.js:113:24
    at tryCatcher (/Users/dominicwatson/Sites/github/my-api/node_modules/bluebird/js/release/util.js:16:23)
    at Promise._settlePromiseFromHandler (/Users/dominicwatson/Sites/github/my-api/node_modules/bluebird/js/release/promise.js:512:31)
    at Promise._settlePromise (/Users/dominicwatson/Sites/github/my-api/node_modules/bluebird/js/release/promise.js:569:18)
    at Promise._settlePromise0 (/Users/dominicwatson/Sites/github/my-api/node_modules/bluebird/js/release/promise.js:614:10)
    at Promise._settlePromises (/Users/dominicwatson/Sites/github/my-api/node_modules/bluebird/js/release/promise.js:693:18)
    at Async._drainQueue (/Users/dominicwatson/Sites/github/my-api/node_modules/bluebird/js/release/async.js:133:16)
    at Async._drainQueues (/Users/dominicwatson/Sites/github/my-api/node_modules/bluebird/js/release/async.js:143:10)
    at Immediate.Async.drainQueues (/Users/dominicwatson/Sites/github/my-api/node_modules/bluebird/js/release/async.js:17:14)
    at runCallback (timers.js:789:20)
    at tryOnImmediate (timers.js:751:5)
    at processImmediate [as _immediateCallback] (timers.js:722:5)
intellix commented 6 years ago

Looked a little deeper and the reason is mentioned here: https://github.com/mickhansen/graphql-sequelize/pull/568#discussion_r170422413

Temporary workaround for anyone else is to explicitly define an orderBy on all connections

stale[bot] commented 4 years ago

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.