|
|
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 }; |
|
|
|