fix: create empty collection (#1141)
* fix: create empty collection * chore: comment * chore: sqlite support * chore: mysql support * fix: collection api * fix: error message
This commit is contained in:
parent
78402c394b
commit
945c64304a
@ -17,6 +17,57 @@ describe('collection', () => {
|
|||||||
afterEach(async () => {
|
afterEach(async () => {
|
||||||
await db.close();
|
await db.close();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should throw error when create empty collection in sqlite and mysql', async () => {
|
||||||
|
if (!db.inDialect('sqlite', 'mysql')) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
db.collection({
|
||||||
|
name: 'empty',
|
||||||
|
timestamps: false,
|
||||||
|
autoGenId: false,
|
||||||
|
fields: [],
|
||||||
|
});
|
||||||
|
|
||||||
|
let error;
|
||||||
|
|
||||||
|
try {
|
||||||
|
await db.sync({
|
||||||
|
force: false,
|
||||||
|
alter: {
|
||||||
|
drop: false,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
} catch (e) {
|
||||||
|
error = e;
|
||||||
|
}
|
||||||
|
|
||||||
|
expect(error.message.includes("Zero-column tables aren't supported in")).toBeTruthy();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('can create empty collection', async () => {
|
||||||
|
if (db.inDialect('sqlite', 'mysql')) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
db.collection({
|
||||||
|
name: 'empty',
|
||||||
|
timestamps: false,
|
||||||
|
autoGenId: false,
|
||||||
|
fields: [],
|
||||||
|
});
|
||||||
|
|
||||||
|
await db.sync({
|
||||||
|
force: false,
|
||||||
|
alter: {
|
||||||
|
drop: false,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(db.getCollection('empty')).toBeInstanceOf(Collection);
|
||||||
|
});
|
||||||
|
|
||||||
test('removeFromDb', async () => {
|
test('removeFromDb', async () => {
|
||||||
await db.clean({ drop: true });
|
await db.clean({ drop: true });
|
||||||
const collection = db.collection({
|
const collection = db.collection({
|
||||||
|
@ -459,7 +459,9 @@ export class Database extends EventEmitter implements AsyncEmitter {
|
|||||||
if (isMySQL) {
|
if (isMySQL) {
|
||||||
await this.sequelize.query('SET FOREIGN_KEY_CHECKS = 0', null);
|
await this.sequelize.query('SET FOREIGN_KEY_CHECKS = 0', null);
|
||||||
}
|
}
|
||||||
|
|
||||||
const result = await this.sequelize.sync(options);
|
const result = await this.sequelize.sync(options);
|
||||||
|
|
||||||
if (isMySQL) {
|
if (isMySQL) {
|
||||||
await this.sequelize.query('SET FOREIGN_KEY_CHECKS = 1', null);
|
await this.sequelize.query('SET FOREIGN_KEY_CHECKS = 1', null);
|
||||||
}
|
}
|
||||||
|
@ -153,6 +153,15 @@ export class Model<TModelAttributes extends {} = any, TCreationAttributes extend
|
|||||||
static async sync(options) {
|
static async sync(options) {
|
||||||
const model = this as any;
|
const model = this as any;
|
||||||
|
|
||||||
|
// fix sequelize sync with model that not have any column
|
||||||
|
if (Object.keys(model.tableAttributes).length === 0) {
|
||||||
|
if (this.database.inDialect('sqlite', 'mysql')) {
|
||||||
|
throw new Error(`Zero-column tables aren't supported in ${this.database.sequelize.getDialect()}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
options.alter = false;
|
||||||
|
}
|
||||||
|
|
||||||
if (this.collection.isInherited()) {
|
if (this.collection.isInherited()) {
|
||||||
return SyncRunner.syncInheritModel(model, options);
|
return SyncRunner.syncInheritModel(model, options);
|
||||||
}
|
}
|
||||||
|
@ -75,6 +75,33 @@ describe('collections repository', () => {
|
|||||||
await app.destroy();
|
await app.destroy();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should skip sync when create empty collection', async () => {
|
||||||
|
const response = await agent.resource('collections').create({
|
||||||
|
values: {
|
||||||
|
name: 'test',
|
||||||
|
autoGenId: false,
|
||||||
|
sortable: false,
|
||||||
|
timestamps: false,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(response.statusCode).toBe(200);
|
||||||
|
|
||||||
|
await agent.resource('fields').create({
|
||||||
|
values: {
|
||||||
|
name: 'field',
|
||||||
|
type: 'string',
|
||||||
|
collectionName: 'test',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const testCollection = app.db.getCollection('test');
|
||||||
|
|
||||||
|
const tableInfo = await app.db.sequelize.getQueryInterface().describeTable(testCollection.model.tableName);
|
||||||
|
|
||||||
|
expect(tableInfo['field']).toBeDefined();
|
||||||
|
});
|
||||||
|
|
||||||
it('should create collection without id', async () => {
|
it('should create collection without id', async () => {
|
||||||
const response = await agent.resource('collections').create({
|
const response = await agent.resource('collections').create({
|
||||||
values: {
|
values: {
|
||||||
|
@ -87,6 +87,11 @@ export class CollectionModel extends MagicAttributeModel {
|
|||||||
transaction: options?.transaction,
|
transaction: options?.transaction,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// @ts-ignore
|
||||||
|
if (Object.keys(collection.model.tableAttributes).length == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await collection.sync({
|
await collection.sync({
|
||||||
force: false,
|
force: false,
|
||||||
|
Loading…
Reference in New Issue
Block a user