diff --git a/packages/core/database/src/__tests__/collection.test.ts b/packages/core/database/src/__tests__/collection.test.ts index 5c51fbdf0..8b919170b 100644 --- a/packages/core/database/src/__tests__/collection.test.ts +++ b/packages/core/database/src/__tests__/collection.test.ts @@ -17,6 +17,57 @@ describe('collection', () => { afterEach(async () => { 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 () => { await db.clean({ drop: true }); const collection = db.collection({ diff --git a/packages/core/database/src/database.ts b/packages/core/database/src/database.ts index d2f7d4bdb..58450837a 100644 --- a/packages/core/database/src/database.ts +++ b/packages/core/database/src/database.ts @@ -459,7 +459,9 @@ export class Database extends EventEmitter implements AsyncEmitter { if (isMySQL) { await this.sequelize.query('SET FOREIGN_KEY_CHECKS = 0', null); } + const result = await this.sequelize.sync(options); + if (isMySQL) { await this.sequelize.query('SET FOREIGN_KEY_CHECKS = 1', null); } diff --git a/packages/core/database/src/model.ts b/packages/core/database/src/model.ts index 275c02517..a9cd3232c 100644 --- a/packages/core/database/src/model.ts +++ b/packages/core/database/src/model.ts @@ -153,6 +153,15 @@ export class Model { 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 () => { const response = await agent.resource('collections').create({ values: { diff --git a/packages/plugins/collection-manager/src/models/collection.ts b/packages/plugins/collection-manager/src/models/collection.ts index e797e5e8a..739d27ec8 100644 --- a/packages/plugins/collection-manager/src/models/collection.ts +++ b/packages/plugins/collection-manager/src/models/collection.ts @@ -87,6 +87,11 @@ export class CollectionModel extends MagicAttributeModel { transaction: options?.transaction, }); + // @ts-ignore + if (Object.keys(collection.model.tableAttributes).length == 0) { + return; + } + try { await collection.sync({ force: false,