我已经设置了一个带有typeorm(https://github.com/typeorm/typeorm)和NEST(https://github.com/nestjs/nest)的系统,但TypeORM并不是在创建表或列。我的设置是这样的:
import {UserPassword} from '../user/user-password.entity';
import {User} from '../user/user.entity';
createConnection({
type: 'mysql',
host: 'typeorm2.cn32tstd6wqk.eu-central-1.rds.amazonaws.com',
port: 1234,
username: 'username',
password: 'password',
database: 'dbname',
entities: [
// __dirname + '/../**/*.entity{.ts,.js}'
UserPassword,
User
]
})
实体是:
import {Entity, Column, PrimaryGeneratedColumn, OneToOne, JoinColumn} from 'typeorm';
@Entity()
export class UserPassword {
@PrimaryGeneratedColumn()
id: number;
@Column()
hash: string;
@Column()
algorithm: string;
}
和
import {Entity, Column, PrimaryGeneratedColumn, OneToOne, JoinColumn} from 'typeorm';
import {UserPassword} from './user-password.entity';
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column({ length: 35 })
firstName: string;
@Column({ length: 35 })
lastName: string;
@Column({ length: 50})
mail: string;
@OneToOne(type => UserPassword)
@JoinColumn()
password: UserPassword;
}
然后我尝试创建这样的用户:
// ... some code
await this.userPasswordRepository.save(userPassword);
return await this.userRepository.save(user);
但是我收到以下错误:
QueryFailedError: ER_NO_SUCH_TABLE: Table 'typeorm2.user_password' doesn't exist
当我手动插入表格时,我收到错误:
QueryFailedError: ER_BAD_FIELD_ERROR: Unknown column 'hash' in 'field list'
因此看起来typeorm不会生成表/列。有谁知道为什么会这样?
答案 0 :(得分:12)
即使先前的答案对于开发环境是可以接受的,但它们不适用于生产。
您正在寻找的是迁移。建立连接并记录迁移时执行迁移-没有迁移将运行一次以上。 TypeORM还提供CLI,使您可以生成迁移(read more here),从而可以更快地创建迁移。 TypeORM还用时间戳前缀标记每个迁移,以确保它们将以正确的顺序运行-有时您可能想先在主表中运行迁移,有时在支持表上运行。配置连接时,您可以像这样加载迁移:
createConnection({
type: 'mysql',
host: 'typeorm2.cn32tstd6wqk.eu-central-1.rds.amazonaws.com',
port: 1234,
username: 'username',
password: 'password',
database: 'dbname',
entities: [
// __dirname + '/../**/*.entity{.ts,.js}'
UserPassword,
User
],
migrations: ['./migrations/*.js'],
synchronize: false
})
迁移由两部分组成-上(迁移代码)和下(还原迁移的代码)。简单的例子:
import { MigrationInterface, QueryRunner } from 'typeorm';
export class AddImageToUser implements MigrationInterface {
async up(queryRunner: QueryRunner): Promise<any> {
await queryRunner.query(
'ALTER TABLE "user" ADD image varchar(255)'
);
}
async down(queryRunner: QueryRunner): Promise<any> {
await queryRunner.query(
'ALTER TABLE "user" DROP COLUMN image'
);
}
}
如果您想了解更多信息,TypeORM会在其官方Git存储库here中提供详细说明
通常,将数据和架构的同步留给框架是不好的。您应该执行此操作以确保将保留数据库架构。我之前链接的CLI还允许您运行迁移,并因此在将更改推送到生产环境之前对其进行测试。
答案 1 :(得分:8)
连接具有“ synchronize()”方法。您可以使用它来自动创建表和列:
const connection = await createConnection(...);
await connection.synchronize();
答案 2 :(得分:2)
我在创建连接时切换到了具有选项autoSchemaSync
的typeorm版本 0.1.0-alpha.40 ,这使得它可以正常工作:
createConnection({
type: 'mysql',
host: 'typeorm2.cn32tstd6wqk.eu-central-1.rds.amazonaws.com',
port: 1234,
username: 'username',
password: 'password',
database: 'dbname',
entities: [
// __dirname + '/../**/*.entity{.ts,.js}'
UserPassword,
User
],
autoSchemaSync: true,
})
答案 3 :(得分:2)
通过将以下内容添加到ormconfig.json/js/xml/etc
:
synchronize: true
如果表不存在,它将创建一次。
答案 4 :(得分:2)
在您的ormconfig.json文件中设置“同步”-> true(布尔值)
这应该有效
{
"type": "mysql",
"host": "localhost",
"port": 5432,
"username": "root",
"password": "root",
"database": "Identity_Demo",
"synchronize": true,
"logging": true,
"entities": ["dist/**/*.entity.js"]
}
答案 5 :(得分:0)
对我来说,问题在于我要为其生成迁移的实体不是导出的类。
答案 6 :(得分:0)
帮助我的是将模型的名称添加到“ Entity()”装饰器中:
@Entity({ name: 'User' })
答案 7 :(得分:0)
手动指定实体而不是通配符路径名对我有用。
export let dbOptions: ConnectionOptions = {
type: "mysql",
host: "localhost",
port: 3306,
username: "root",
password: "root",
database: "exam",
synchronize: true,
entities: [
// "./entities/*.js", // Wildcard Path : Not working
EmployeeEntity // Specify the entities directly.
]
}
答案 8 :(得分:0)
类似于何塞·米格尔的回答
如果您第一次使用 typeorm-model-generator
生成从数据库到代码的实体,那么 typeorm-model-generator
可能已经用类似的东西生成了您的代码。
@Entity('yourTableName', { schema: 'public' })
我删除了 { schema: 'public' }
让它像
@Entity('yourTableName')
这为我解决了这个问题。 希望它在未来对某人有所帮助:)