Cannot perform update query because update values are not defined.

See original GitHub issue

Issue type:

[x] question [ ] bug report [ ] feature request [ ] documentation issue

Database system/driver:

[ ] cordova [ ] mongodb [ ] mssql [ ] mysql / mariadb [ ] oracle [x] postgres [ ] cockroachdb [ ] sqlite [ ] sqljs [ ] react-native [ ] expo

TypeORM version:

[x] latest [ ] @next [ ] 0.x.x (or put your version here)

I am getting an error when trying to save to the database. It looks like I’m just misunderstanding saving with a repository or perhaps how the promise works in this situation, but any help would be great.

I am including a break down of all the files, sorry its long!

Here is the error I’m seeing surfaced from my docker instance.

Error caught:  { UpdateValuesMissingError: Cannot perform update query because update values are not defined. Call "qb.set(...)" method to specify updated values.
experiments_ms_1  |     at new UpdateValuesMissingError (/experiments-service/src/error/UpdateValuesMissingError.ts:8:9)
experiments_ms_1  |     at UpdateQueryBuilder.createUpdateExpression (/experiments-service/src/query-builder/UpdateQueryBuilder.ts:456:19)
experiments_ms_1  |     at UpdateQueryBuilder.getQuery (/experiments-service/src/query-builder/UpdateQueryBuilder.ts:45:24)
experiments_ms_1  |     at UpdateQueryBuilder.QueryBuilder.getQueryAndParameters (/experiments-service/src/query-builder/QueryBuilder.ts:385:28)
experiments_ms_1  |     at UpdateQueryBuilder.<anonymous> (/experiments-service/src/query-builder/UpdateQueryBuilder.ts:82:44)
experiments_ms_1  |     at step (/experiments-service/node_modules/tslib/tslib.js:133:27)
experiments_ms_1  |     at Object.next (/experiments-service/node_modules/tslib/tslib.js:114:57)
experiments_ms_1  |     at /experiments-service/node_modules/tslib/tslib.js:107:75
experiments_ms_1  |     at new Promise (<anonymous>)
experiments_ms_1  |     at Object.__awaiter (/experiments-service/node_modules/tslib/tslib.js:103:16)
experiments_ms_1  |   name: 'UpdateValuesMissingError',
experiments_ms_1  |   message:
experiments_ms_1  |    'Cannot perform update query because update values are not defined. Call "qb.set(...)" method to specify updated values.' }

Steps to reproduce:

Requirements: NodeJs/Express, TypeScript

The following file is out basic file setup.

/entity/Experiment.ts

import {Entity, PrimaryGeneratedColumn, Column, ManyToOne, OneToMany, ManyToMany, JoinTable} from "typeorm";
import { Author } from "./Author";
import { Image } from "./Image";
import { Platform } from './Platform';
import { Variation } from "./Variation";

@Entity()
export class Experiment {

    @PrimaryGeneratedColumn()
    id: number;

    @Column({
        nullable: true
      })
    testplan: string; 
    
    @Column({
        nullable: true
      })
    name: string;

    @Column({
        nullable: true
      })
    isLive: boolean;

    @ManyToOne(type => Author, author => author.experiments)
    author: Author;

    @ManyToOne(type => Platform, platform => platform.experiments)
    platform: Platform;

    @OneToMany(type => Image, image => image.experiment)
    images: Image[];

    @OneToMany(type => Variation, variation => variation.experiment)
    variations: Variation[];
}

/entity/Variation.ts

import {Entity, PrimaryGeneratedColumn, Column, ManyToOne} from "typeorm";
import { Experiment } from "./Experiment";

@Entity()
export class Variation {
    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    url: string;

    @ManyToOne(type => Experiment, experiment => experiment.variations)
    experiment: Experiment;
}

/entity/Image.ts

import {Entity, PrimaryGeneratedColumn, Column, ManyToOne} from "typeorm";
import { Experiment } from "./Experiment";

@Entity()
export class Image {
    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    path: string;

    @ManyToOne(type => Experiment, experiment => experiment.images)
    experiment: Experiment;
}

/entity/Author.ts

import {Entity, PrimaryGeneratedColumn, Column, OneToMany, JoinColumn} from "typeorm";
import {Experiment} from "./Experiment";

@Entity()
export class Author {
    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    firstName: string;

    @Column()
    lastName: string;

    @Column()
    prefs: 'json';

    @OneToMany(type => Experiment, experiment => experiment.author)
    experiments: Experiment[];
}

/entity/Platform.js

import {Entity, PrimaryGeneratedColumn, Column, OneToMany, JoinColumn} from "typeorm";
import {Experiment} from "./Experiment";

@Entity()
export class Platform {
    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    name: string;

    @OneToMany(type => Experiment, experiment => experiment.platform)
    experiments: Experiment[];
}

/index.ts

import "reflect-metadata";
import * as express from "express";
import * as bodyParser from "body-parser";
import {Request, Response} from "express";
import {Routes} from "./routes";
import {createConnection} from "typeorm";

createConnection().then(async connection => {

const app = express();
app.use(bodyParser.json());

// register express routes from defined application routes
Routes.forEach(route => {
    (app as any)[route.method](route.route, (req: Request, res: Response, next: Function) => {
        const result = (new (route.controller as any))[route.action](req, res, next);
        if (result instanceof Promise) {
            result.then(result => result !== null && result !== undefined ? res.send(result) : undefined);

        } else if (result !== null && result !== undefined) {
            res.json(result);
        }
    });
});

// start express server
app.listen(3000);

console.log("Express server has started on port 3000. Open http://localhost:3000/health to see it running.");

}).catch(error => console.log("TypeORM connection error: ", error));

/routes.ts

import {UserController} from "./controller/UserController";
import {ExperimentController} from "./controller/ExperimentController";
import {HealthController} from "./controller/HealthController";

export const Routes = [{
    method: "post",
    route: "/experiments",
    controller: ExperimentController,
    action: "save"
}

/controller/ExperimentController.ts


import {createConnection, getManager} from "typeorm";
import {getRepository} from "typeorm";
import {NextFunction, Request, Response} from "express";
import {Experiment} from "../entity/Experiment";
import {Author} from "../entity/Author";
import {Image} from "../entity/Image";
import {User} from "../entity/User";
import {Variation} from "../entity/Variation";
import { Platform } from "../entity/Platform";

// ... Other functions ...
       async save(request: Request, response: Response, next: NextFunction) {

        const author = new Author();
        author.firstName = "Aaron";
        author.lastName = "Montana";
    
        const platform = new Platform();
        platform.name = "SaaS 1";
        
        const image = new Image();
        image.path = "/path/to/image.svg";

        const v1 = new Variation();
        v1.url = "http://example.com/path1";

        const v2 = new Variation();
        v2.url = "http://example.com/path2";
    
        const experiment = new Experiment();
        experiment.testplan = "https://link.to/document";
        experiment.name = 'Experiment 100';
        experiment.isLive = true;    
        experiment.author = author;
        experiment.platform = platform;
        experiment.images = [image];
        experiment.variations = [v1,v2];

        try{
           let savedExp =  await getManager().getRepository(Experiment).save(experiment);
            console.log("Post has been saved: ", experiment, savedExp);
            response.send(experiment);
        }catch(e){
            console.log('Error caught: ', e);
            response.send(e);
        }   
    }

Thanks for taking a look 😃

Issue Analytics

  • State:closed
  • Created 5 years ago
  • Comments:11 (1 by maintainers)

github_iconTop GitHub Comments

94reactions
aaroninaustincommented, Mar 22, 2019

Closing this one - I figured it out. Turns out I was missing the cascade option:

 @OneToMany(type => Variation, variation => variation.experiment, {
        cascade: true,
    })
14reactions
tth37commented, Mar 5, 2022

In my case I forgot to add @ JoinColumn at a @ OneToOne relation.

Read more comments on GitHub >

github_iconTop Results From Across the Web

Cannot perform update query because update values are not ...
My graphql is defined like this: input CreateTeamPayload { name: String tacts:[ID!] } type Team { id: ID! name: String tacts: [Tact]! }...
Read more >
Update using Query Builder - typeorm - GitBook
Update using Query Builder. You can create UPDATE queries using QueryBuilder . Examples: await dataSource .createQueryBuilder() .update(User) .set({ ...
Read more >
typeorm - UNPKG
... class UpdateValuesMissingError extends TypeORMError {\n constructor() {\n super(\n `Cannot perform update query because update values are not defined.
Read more >
TypeORM - Quick Guide - Tutorialspoint
This section explains about how to access database queries like insert, update, select and delete queries using QueryBuilder. Let's go through one by...
Read more >
Troubleshoot errors when updating data in query or form - Office
When you do not have Update Data permissions for the query or the underlying table, you cannot update data. To resolve this problem,...
Read more >

github_iconTop Related Medium Post

No results found

github_iconTop Related StackOverflow Question

No results found

github_iconTroubleshoot Live Code

Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free

github_iconTop Related Reddit Thread

No results found

github_iconTop Related Hackernoon Post

No results found

github_iconTop Related Tweet

No results found

github_iconTop Related Dev.to Post

No results found

github_iconTop Related Hashnode Post

No results found