| const fs = require('fs'); |
| const path = require('path'); |
|
|
| |
| |
| |
|
|
| |
| const sqliteToPostgresConversions = [ |
| |
| { |
| pattern: /INTEGER\s+NOT\s+NULL\s+PRIMARY\s+KEY\s+AUTOINCREMENT/g, |
| replacement: 'SERIAL PRIMARY KEY' |
| }, |
| { |
| pattern: /\s+AUTOINCREMENT/g, |
| replacement: '' |
| }, |
| |
| { |
| pattern: /\bDATETIME\b/g, |
| replacement: 'TIMESTAMP' |
| }, |
| |
| { |
| pattern: /DEFAULT\s+(?:'?(false|true)'?)/gi, |
| replacement: "DEFAULT $1" |
| }, |
| |
| { |
| pattern: /DEFAULT\s+'?0'?/g, |
| replacement: "DEFAULT 0" |
| }, |
| { |
| pattern: /DEFAULT\s+'?1'?/g, |
| replacement: "DEFAULT 1" |
| } |
| ]; |
|
|
| |
| |
| |
| function convertSqlFile(filePath) { |
| try { |
| let sqlContent = fs.readFileSync(filePath, 'utf8'); |
|
|
| console.log(`转换文件: ${path.basename(filePath)}`); |
|
|
| |
| sqliteToPostgresConversions.forEach(({ pattern, replacement }) => { |
| sqlContent = sqlContent.replace(pattern, replacement); |
| }); |
|
|
| |
| fs.writeFileSync(filePath, sqlContent); |
|
|
| console.log(`✓ ${path.basename(filePath)} 转换完成`); |
| return true; |
| } catch (error) { |
| console.error(`✗ ${path.basename(filePath)} 转换失败:`, error.message); |
| return false; |
| } |
| } |
|
|
| |
| |
| |
| function convertMigrationsDirectory(migrationsDir) { |
| const items = fs.readdirSync(migrationsDir); |
|
|
| let successCount = 0; |
| let failCount = 0; |
|
|
| items.forEach(item => { |
| const itemPath = path.join(migrationsDir, item); |
| const stat = fs.statSync(itemPath); |
|
|
| if (stat.isDirectory() && item !== 'migration_lock.toml') { |
| |
| const result = convertMigrationsDirectory(itemPath); |
| successCount += result.successCount; |
| failCount += result.failCount; |
| } else if (item === 'migration.sql') { |
| |
| if (convertSqlFile(itemPath)) { |
| successCount++; |
| } else { |
| failCount++; |
| } |
| } |
| }); |
|
|
| return { successCount, failCount }; |
| } |
|
|
| |
| |
| |
| function main() { |
| const migrationsDir = path.join(__dirname, 'migrations'); |
|
|
| console.log('开始转换 SQLite 迁移文件到 PostgreSQL 语法...\n'); |
|
|
| const result = convertMigrationsDirectory(migrationsDir); |
|
|
| console.log(`\n转换完成!`); |
| console.log(`成功: ${result.successCount} 个文件`); |
| console.log(`失败: ${result.failCount} 个文件`); |
| } |
|
|
| |
| if (require.main === module) { |
| main(); |
| } |
|
|
| module.exports = { convertSqlFile, convertMigrationsDirectory }; |
|
|