从 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()

完结!

相关推荐
云絮.20 分钟前
数据库操作
数据库·mysql·算法·oracle
许彰午26 分钟前
30_Java Stream流操作全解
java·windows·python
小小工匠36 分钟前
Redis 缓存替换策略:8 种淘汰策略与 LRU 实现剖析
数据库·redis·缓存
秋942 分钟前
3年经验Python后端转AI Engineer:3个月实战转型计划(2026版)
开发语言·人工智能·python
圣殿骑士-Khtangc1 小时前
GPT-5.5 技术深度解析与企业级生产落地实战:从幻觉率下降到百万Token工程化
人工智能·gpt
2601_961963381 小时前
技术解剖:哈希值、区块链与CA认证如何守护电子合同安全?
网络·人工智能·安全·区块链·智能合约·政务
2601_961963381 小时前
从“电子化”到“自动化”:2026年智能合约与电子合同融合的技术逻辑与法律适配
网络·人工智能·区块链·智能合约·政务
2601_956319881 小时前
期货夜盘无人值守监控什么:断线、无成交与拒单信号
python·区块链
CTA终结者1 小时前
期货量化目标仓和净持仓对不齐:天勤 TargetPosTask 与 pos 偏差排查
python·区块链
米小虾1 小时前
AI Skills 工程化:当每个开发者都有一支「AI 小队」,你该怎么管理?
人工智能