Automatically tracks BelongsTo relations to import all necessary data.
# When importing User #1...pnpm sonamu fixture import User 1# Automatically imports:# - User #1# - User #1's Profile (OneToOne)# - Profile's related data
Internal operation:
async function getImportQueries(entityId: string, field: string, id: number): Promise<string[]> { // Prevent circular references const recordKey = `${entityId}#${field}#${id}`; if (this.visitedRecords.has(recordKey)) { return []; } this.visitedRecords.add(recordKey); // Fetch record const entity = EntityManager.get(entityId); const [row] = await wdb(entity.table).where(field, id).limit(1); if (!row) { throw new Error(`Cannot find ${entityId}#${id} row.`); } // Handle BelongsTo relations const relatedQueries = []; for (const [, relation] of Object.entries(entity.relations)) { if (isBelongsToOneRelationProp(relation)) { const relatedId = row[`${relation.name}_id`]; if (relatedId) { // Recursively import related data relatedQueries.push(...(await this.getImportQueries(relation.with, "id", relatedId))); } } } // Generate INSERT query const selfQuery = `INSERT IGNORE INTO fixture.${entity.table} (SELECT * FROM production.${entity.table} WHERE id = ${id})`; return [...relatedQueries, selfQuery];}
After import, Fixture DB β Test DB sync is automatically executed.
async function fixture_import(entityId: string, recordIds: number[]) { await setupFixtureManager(); // 1. Production β Fixture DB await FixtureManager.importFixture(entityId, recordIds); // 2. Fixture DB β Test DB await FixtureManager.sync();}
# To import User #1 and all their Posts# 1. Import Userpnpm sonamu fixture import User 1# 2. Import User's Posts separatelypnpm sonamu fixture import Post 10,11,12# HasMany is not automatically tracked# (could import too much data)
# To import Post #1 and related Tags# 1. Import Postpnpm sonamu fixture import Post 1# 2. Handle junction table data manually# (or create directly in fixture.ts)
# β Correct: Only what's neededpnpm sonamu fixture import User 1,2# β Wrong: Too much datapnpm sonamu fixture import User 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
# Select data including various casespnpm sonamu fixture import User 1 # Regular userpnpm sonamu fixture import User 100 # Adminpnpm sonamu fixture import User 500 # Premium user
# Slow when importing too many IDs at oncepnpm sonamu fixture import User 1,2,3,...,100# Solution: Split into multiple executionspnpm sonamu fixture import User 1,2,3,4,5pnpm sonamu fixture import User 6,7,8,9,10