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 () => { | ||||
|     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({ | ||||
|  | ||||
| @ -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); | ||||
|     } | ||||
|  | ||||
| @ -153,6 +153,15 @@ export class Model<TModelAttributes extends {} = any, TCreationAttributes extend | ||||
|   static async sync(options) { | ||||
|     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()) { | ||||
|       return SyncRunner.syncInheritModel(model, options); | ||||
|     } | ||||
|  | ||||
| @ -75,6 +75,33 @@ describe('collections repository', () => { | ||||
|     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: { | ||||
|  | ||||
| @ -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, | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user