从 sqlite 迁移到 Oracle 数据库

从 sqlite 迁移到 Oracle 数据库

  • [0. 引言](#0. 引言)
  • [1. 代码](#1. 代码)

0. 引言

今天发现一个有意思的竞赛,竞赛中使用了 sqlite 数据库。

由于个人更习惯 Oracle 数据库,所以将 sqlite 数据库迁移到了 Oracle 数据库。

此文章记录一下迁移时使用的 Python 代码。

1. 代码

复制代码
import os
import sqlite3

import oracledb
from dotenv import find_dotenv, load_dotenv

_ = load_dotenv(find_dotenv())

# 连接SQLite数据库
sqlite_conn = sqlite3.connect('./dataset/博金杯比赛数据.db')
sqlite_cursor = sqlite_conn.cursor()

# 连接Oracle数据库
oracle_conn = oracledb.connect(user="username", password="password", dsn="host:port/service_name")
oracle_cursor = oracle_conn.cursor()

# 获取SQLite数据库中的表名
sqlite_cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")
tables = sqlite_cursor.fetchall()


def map_sqlite_type_to_oracle(sqlite_type):
    # 根据需要映射SQLite数据类型到Oracle数据类型
    # 这是一个更详尽的映射示例
    mapping = {
        'INTEGER': 'NUMBER(10)',
        'TEXT': 'VARCHAR2(255)',
        'REAL': 'FLOAT',
        'BLOB': 'BLOB',
        'NUMERIC': 'NUMBER'
    }
    return mapping.get(sqlite_type, 'VARCHAR2(255)')  # 默认类型为 VARCHAR2(255)


# 迭代每个表
for table in tables:
    table_name = table[0]
    print(f"Migrating table: {table_name}")

    # 获取表结构
    sqlite_cursor.execute(f"PRAGMA table_info({table_name});")
    columns = sqlite_cursor.fetchall()

    # 构建并执行Oracle表的创建语句
    column_defs = ', '.join(f"\"{column[1]}\" {map_sqlite_type_to_oracle(column[2])}" for column in columns)
    create_table_query = f"CREATE TABLE {table_name} ({column_defs})"
    print(f"{create_table_query=}")
    oracle_cursor.execute(create_table_query)
    # 测试时想Drop掉Table时使用
    # oracle_cursor.execute(f"DROP TABLE {table_name}")

    # 准备批量插入语句
    col_placeholders = ', '.join([':' + str(i + 1) for i in range(len(columns))])
    insert_query = f"INSERT INTO {table_name} VALUES ({col_placeholders})"

    # 迁移数据
    sqlite_cursor.execute(f"SELECT * FROM {table_name};")
    rows = sqlite_cursor.fetchall()
    oracle_cursor.executemany(insert_query, rows)
    oracle_conn.commit()

sqlite_conn.close()
oracle_conn.close()

完结!

相关推荐
卷Java11 分钟前
uni-app 模板语法修复说明
java·数据库·spring boot·uni-app·mybatis
Gerlat小智12 分钟前
【Python精讲 16】实战项目演练(二):用Flask/FastAPI发布你的第一个Web API
python·flask·fastapi
算家云15 分钟前
OpenAI秘密测试ChatGPT安全路由,情感对话触发GPT-5严格审查
人工智能·chatgpt·算家云·openai秘密测试安全路由·算家计算·租算力,就到算家云
新加坡内哥谈技术16 分钟前
OpenAI近日推出了一项名为 ChatGPT Pulse 的全新功能
人工智能·chatgpt
hunteritself17 分钟前
DeepSeek V3.1-Terminus、阿里 Qwen3-Max、ChatGPT Pulse 同周登场!| AI Weekly 9.22-9.28
人工智能·ios·chatgpt·语音识别·iphone
ai_xiaogui20 分钟前
ChatGPT开源模型发布!部署20B/120B AI模型实战指南
人工智能·chatgpt·20b 120b模型部署教程·本地部署chatgpt模型实战·高性能加速开源ai模型开发·开源模型windows配置方法
春末的南方城市20 分钟前
阿里开源视频修复方法Vivid-VR:以独特策略与架构革新,引领生成视频修复高质量可控新时代。
人工智能·深度学习·机器学习·计算机视觉·aigc
Juchecar32 分钟前
人工智能重塑人类生活范式
人工智能
Never_Satisfied32 分钟前
在JavaScript / Node.js中,SQLite异步查询函数实现
javascript·sqlite·node.js
FIT2CLOUD飞致云32 分钟前
飞致云开源社区月度动态报告(2025年9月)
人工智能·开源