File size: 2,762 Bytes
c8317fa |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
const fs = require('fs');
const path = require('path');
/**
* 将 SQLite 迁移文件转换为 PostgreSQL 语法
*/
// SQLite 到 PostgreSQL 的转换映射
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"
}
];
/**
* 转换单个 SQL 文件
*/
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 };
|