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