Typeorm 0.2.8
Я создаю приложение Ionic как для мобильного использования, так и для браузера (PWA).Ниже приведен сокращенный код из моего проекта.Я создаю простую сущность с PrimaryGeneratedColumn
и пытаюсь вставить один экземпляр.Это приводит к ошибке о том, что первичный столбец NULL
.Разве слово «сгенерировано» не означает, что значение столбца генерируется?
Это ошибка?Что-то специфическое для драйвера sqljs
?Или что-то очевидное и простое, которое я пропустил?
Сущность
@Entity()
export class MyEntity {
@PrimaryGeneratedColumn()
id:number;
@Column()
name:string;
@CreateDateColumn()
createdAt:string;
}
Миграция
export class Migration20181022133900 implements MigrationInterface {
async up(queryRunner: QueryRunner): Promise<any> {
await queryRunner.createTable(new Table({
name: 'my_entity',
columns: [
{
name: 'id',
type: 'int',
isPrimary: true,
isGenerated: true
},
{
name: 'name',
type: 'varchar'
},
{
name: 'createdAt',
type: 'timestamp',
'default': 'now()'
}
]
}), true);
}
async down(queryRunner: QueryRunner): Promise<any> {
await queryRunner.dropTable('my_entity');
}
}
Поставщик базы данных
const DATABASE_SHARED_OPTIONS:Partial<ConnectionOptions> = {
entities: [
MyEntity
],
logging: 'all',
logger: new DatabaseLogger(),
migrationsRun: true,
migrations: [
Migration20181022133900
]
};
@Injectable()
export class Database {
constructor(public platform:Platform) {}
setup(): Promise<Connection> {
let options: CordovaConnectionOptions | SqljsConnectionOptions;
// Mobile app
if (this.platform.is('cordova')) {
options = {
type: 'cordova',
database: 'my_project.db',
location: 'default',
};
options = Object.assign(options, DATABASE_SHARED_OPTIONS);
}
// Browser PWA app
else {
options = {
type: 'sqljs',
autoSave: true,
location: 'my_project',
};
options = Object.assign(options, DATABASE_SHARED_OPTIONS);
}
return createConnection(options);
}
}
Компонент приложения
export class MyApp {
constructor(
platform: Platform,
database: Database
) {
platform.ready().then(() => {
database.setup()
.then((connection) => {
this.insertTest();
});
});
}
insertTest() {
const myEntity= new MyEntity();
myEntity.name = 'foo';
getRepository(MyEntity).save(myEntity)
.then((data) => {
console.log(data); // never reached due to error
});
}
}
Журнал базы данных показывает следующий запрос (с параметрами ["foo"]
):
INSERT INTO "my_entity"("name", "createdAt") VALUES (?, datetime('now'))
В моей консоли отображается следующая ошибка:
ERROR Error: Uncaught (in promise): QueryFailedError: NOT NULL constraint failed: my_entity.id
Обновление 1
Кажется, выдает ошибку только при использовании миграций.Удаление миграций и использование synchronize: true
в настройке базы данных работает и генерирует id
для сущности.Так что-то не так с моим определением столбца в коде миграции?
{
name: 'id',
type: 'int',
isPrimary: true,
isGenerated: true
}
Обновление 2
Хорошо, я исправил это.Конфигурация миграции для @PrimaryGeneratedColumn
представляется очень специфичной.Для всех, кто сталкивался с этой проблемой, это исправило ее для меня:
{
name: 'id',
type: 'integer', // instead of 'int', required for the increment strategy
isPrimary: true,
isGenerated: true,
generationStrategy: 'increment' // thought this was the default
}