I'm doing a course where we are using express-node postgres and react (with typescript) and typeORM. Everything has worked well so far, but I'm facing an issue with typeORM and I don't know what is going and why is this error happening
The Big Problem : So, the problem is that, I was doing the auth, and at some point we changed users schema in the DB so we had to make a migration, but, before migration, we did npm run typeorm schema:drop
,but when I tried, this happened with migration
This is the first command I used
npm run typeorm migration:generate -- --n create-users-table
This was the error
> [email protected] typeorm C:\Users\diego cifuentes\Desktop\Studying Backend\redit> ts-node ./node_modules/typeorm/cli.js "migration:generate" "create-users-table"
bin.js migration:generate
Generates a new migration file with sql needs to be executed to update
schema.
Opciones:
-h, --help Muestra ayuda [booleano] -c, --connection Name of the connection on which run a query.
[defecto: "default"] -n, --name Name of the migration class.
[cadena de caracteres] [requerido] -d, --dir Directory where migration should be created.
-p, --pretty Pretty-print generated SQL
[booleano] [defecto: false] -f, --config Name of the file with connection configuration.
[defecto: "ormconfig"] -o, --outputJs Generate a migration file on Javascript instead of
Typescript [booleano] [defecto: false] --dr, --dryrun Prints out the contents of the migration instead of
writing it to a file [booleano] [defecto: false] --ch, --check Verifies that the current database is up to date and that no migrations are needed. Otherwise exits with
code 1. [booleano] [defecto: false] -v, --version Muestra número de versión [booleano]
Falta argumento requerido: n
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! [email protected] typeorm: `ts-node ./node_modules/typeorm/cli.js "migration:generate" "create-users-table"`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the [email protected] typeorm script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
npm ERR! A complete log of this run can be found in:
npm ERR! C:\Users\diego cifuentes\AppData\Roaming\npm-cache\_logs\2021-05-11T15_29_02_081Z-debug.log
After hours trying to search for solution everywhere, I change the last command to this one
npx typeorm migration:generate -- --n create-users-table
And the error was different this time, looks like this
No changes in database schema were found - cannot generate a migration. To create a new empty migration use "typeorm migration:create" command
So, I said, ok, I'm getting closer to fixing this, but... After hours ( again ) looking for a new answer, I couldn't find anything, so, I'm getting to a point where I need to write this post in order to fix my problem. So now, let me show you my ormconfig, my package.json and the entity I want to migrate in my postgres DB.
package.json (the script typeorm is at the end)
{
"name": "new-typeorm-project",
"version": "0.0.1",
"description": "Awesome project developed with TypeORM.",
"devDependencies": {
"@types/bcrypt": "^5.0.0",
"@types/cookie": "^0.4.0",
"@types/cookie-parser": "^1.4.2",
"@types/express": "^4.17.11",
"@types/jsonwebtoken": "^8.5.1",
"@types/morgan": "^1.9.2",
"@types/node": "^15.0.2",
"morgan": "^1.10.0",
"nodemon": "^2.0.7",
"ts-node": "^9.1.1",
"typescript": "^4.2.4"
},
"dependencies": {
"bcrypt": "^5.0.1",
"class-transformer": "^0.4.0",
"class-validator": "^0.13.1",
"cookie": "^0.4.1",
"cookie-parser": "^1.4.5",
"dotenv": "^9.0.1",
"express": "^4.17.1",
"jsonwebtoken": "^8.5.1",
"pg": "^8.4.0",
"reflect-metadata": "^0.1.10",
"typeorm": "0.2.32"
},
"scripts": {
"start": "ts-node src/server.ts",
"dev": "nodemon --exec ts-node src/server.ts",
"typeorm": "ts-node ./node_modules/typeorm/cli.js"
}
}
ormconfing.json Quick note : I changed entities, migrations and subscribers to .js, because with .ts was always giving me error.
{
"type": "postgres",
"host": "localhost",
"port": 5432,
"username": "**",
"password": "**",
"database": "**",
"synchronize": true,
"logging": true,
"entities": ["src/entities/**/*.js"],
"migrations": ["src/migrations/**/*.js"],
"subscribers": ["src/subscribers/**/*.js"],
"cli": {
"entitiesDir": "src/entities",
"migrationsDir": "src/migrations",
"subscribersDir": "src/subscribers"
}
}
And last thing I want to show you, even though it might not be that important, this is the users schema
import {
Entity as TOEntity,
Column,
Index,
BeforeInsert,
OneToMany
} from "typeorm";
import bcrypt from "bcrypt";
import { IsEmail, Length } from "class-validator";
import { Exclude } from "class-transformer";
import Entity from "./Entity";
// import Post from "./Post";
@TOEntity("users")
export default class User extends Entity {
constructor(user: Partial<User>) {
super();
Object.assign(this, user);
}
@Index()
@IsEmail()
@Column({ unique: true })
email: string;
@Index()
@Length(3, 200)
@Column({ unique: true })
username: string;
@Exclude()
@Length(6, 200)
@Column()
password: string;
// @OneToMany(() => Post, post => post.user)
// posts: Post[];
@BeforeInsert()
async hashedPassword() {
this.password = await bcrypt.hash(this.password, 6);
}
}
End Goal: So, if you can help me with this, you will save my life. One last thing is that I tried to post my problems first in the Spanish website of stack overflow, but nobody could help me, so maybe here someone will, thanks for your time and take care!
You need to create a new migration with the following SQL query (postgres dialect): ALTER TABLE "post" ALTER COLUMN "title" RENAME TO "name"; Once you run this SQL query your database schema is ready to work with your new codebase. TypeORM provides a place where you can write such sql queries and run them when needed.
up method is used to add changes to the migration and down method is used to revert changes in your migration. Here, We have added a new column price inside book table. Now, execute the CLI to add the above changes.
synchronize: true, }) This option automatically syncs your database tables with the given entities each time you run this code. This option is perfect during development, but in production you may not want this option to be enabled.
Change your entities
, migrations
and subscribers
into your dist
directory.
e.g.:
entities: ["dist/entities/**/*{.js,.ts}"],
migrations: ["dist/migrations/**/*{.js,.ts}"],
subscribers: ["dist/subscribers/**/*{.js,.ts}"],
dist
directory is the directory which gets created when you build the app. You can find your dist
directory using tsconfig.json
-> compilerOptions
-> outDir
.
Then build your app again using npm run build
and try to generate the migrations.
I've seen this error, and if I'm not mistaken it's because I was trying to create a bank that had already been created.
This command below deletes all tables:
yarn typeorm query "DROP SCHEMA public CASCADE; CREATE SCHEMA public; GRANT USAGE ON SCHEMA public to PUBLIC; GRANT CREATE ON SCHEMA public to PUBLIC; COMMENT ON SCHEMA public IS 'standard public schema';"
then:
yarn typeorm --migration:generate -n migration_name -d path/to/your/migrations/
For me the ormconfig.json's was like this,
"entities": [
"dist/entity/**/*.ts"
],
"migrations": [
"src/migration/**/*.ts"
],
"subscribers": [
"src/subscriber/**/*.ts"
],
Changing it to
"entities": [
"src/entity/**/*{.js,.ts}"
],
"migrations": [
"src/migration/**/*{.js,.ts}"
],
"subscribers": [
"src/subscriber/**/*{.js,.ts}"
],
generated the migration correctly.
And the package.json script is like this "typeorm": "node --require ts-node/register ./node_modules/typeorm/cli.js"
And the command used is
npm run typeorm migration:generate -- -n FileAddTemporaryDeletedFields -p --dr --ch
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With