PostgreSQL

关注公众号 jb51net

关闭
首页 > 数据库 > PostgreSQL > SQLCipher数据迁移到PostgreSql

SQLCipher数据迁移到PostgreSql详细教程

作者:God写注释没有代码

这篇文章主要介绍了SQLCipher数据迁移到PostgreSql详细教程,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

步骤一、安装Docker

步骤二、SQLCipher解密,转换为Sqlite3

步骤三、将Sqlite中的数据迁移到PostgreSql中

1. Docker安装PostgreSql

docker run --name my_postgres \
  -e POSTGRES_PASSWORD=mysecretpassword \  # 设置超级用户密码,务必修改
  -p 5432:5432 \                           # 映射主机端口 5432 到容器端口 5432
  -v pgdata:/var/lib/postgresql/data \     # 使用命名卷 pgdata 持久化数据
  -d \                                     # 后台运行容器
  postgres                                 # 使用官方镜像

2. 拉取pgloader镜像

docker pull ghcr.io/dimitri/pgloader:latest

3. 准备迁移脚本 migration.load

LOAD DATABASE
    FROM sqlite:////data/main_data.db
    INTO postgresql://postgres:123456@host.docker.internal:5432/main
WITH include drop, create tables, create indexes, reset sequences, foreign keys,
     workers = 8, concurrency = 1
ALTER SCHEMA 'main' RENAME TO 'public'
BEFORE LOAD DO
$$ create schema if not exists public; $$;

🔔 参数说明​:

4. 执行迁移

使用 Docker 运行 pgloader并执行迁移脚本。​注意将 /path/to/your/migration.load 替换为你实际的 migration.load文件的绝对路径。/path/to/your/data 替换为你实际的 db 文件的所在目录。

docker run --rm -v /path/to/your/migration.load:/migration.load -v /path/to/your/data:/data ghcr.io/dimitri/pgloader:latest pgloader /migration.load

🔔 命令说明​:

步骤四、特别注意

由于 Pgloader 在将 SQLite 的 INTEGER 类型(在 SQLite 中通常用来表示布尔值,0 或 1)迁移到 PostgreSQL 时,将它映射成了 PostgreSQL 的 BIT 类型,而不是 BOOLEAN 或 INTEGER。PostgreSQL 的 BIT 类型是位字符串类型,它和 INTEGER 类型无法直接进行 = 比较。所以当你执行 "isdelete" = 0 时,PostgreSQL 就会报错,提示找不到一个可以比较 BIT 和 INTEGER 的操作符。报错信息如下:

SQL 错误 [42883]: ERROR: operator does not exist: bit = integer
Hint: No operator matches the given name and argument types. You might need to add explicit type casts.

所以我们需要将数据库中所有bit(1)类型的字段转换成boolean类型,但是PostgreSql中这两个类型不能直接转换,所以要先将bit(1)先转成 integer 再转成 boolean。下面是一个可以完成这个任务的 PostgreSQL PL/pgSQL 代码块。你可以将其作为一个匿名代码块 (DO 语句) 在 psql 或任何 PostgreSQL 客户端中运行。

DO $$
DECLARE
rec RECORD;
table_name TEXT;
column_name TEXT;
alter_sql TEXT;
BEGIN
-- 遍历数据库中所有表的模式(public)
FOR rec IN
SELECT
c.table_schema,
c.table_name,
c.column_name
FROM
information_schema.columns c
WHERE
c.table_schema = 'public' -- 只在 public 模式下查找,可以根据需要更改
AND c.data_type = 'bit'
AND c.character_maximum_length = 1
LOOP
table_name := rec.table_name;
column_name := rec.column_name;
RAISE NOTICE '正在处理表: %, 列: %', table_name, column_name;
-- 构造 ALTER TABLE 语句,先转成 integer
alter_sql := format('ALTER TABLE %I.%I ALTER COLUMN %I TYPE INTEGER USING %I::integer;',
rec.table_schema, table_name, column_name, column_name);
-- 执行 SQL
EXECUTE alter_sql;
-- 构造 ALTER TABLE 语句,再转成 boolean
alter_sql := format('ALTER TABLE %I.%I ALTER COLUMN %I TYPE BOOLEAN USING %I::boolean;',
rec.table_schema, table_name, column_name, column_name);
-- 执行 SQL
EXECUTE alter_sql;
END LOOP;
RAISE NOTICE '所有 bit(1) 字段转换完成。';
END $$;

到此,SQLite的数据已经全部迁移到PostgreSql啦~

到此这篇关于SQLCipher数据迁移到PostgreSql详细攻略的文章就介绍到这了,更多相关SQLCipher数据迁移到PostgreSql内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文