SQL Alchemy - 从 Oracle 迁移到 MySQL 的 Python 脚本

     2023-03-23     272

关键词:

【中文标题】SQL Alchemy - 从 Oracle 迁移到 MySQL 的 Python 脚本【英文标题】:SQL Alchemy - Python script to migrate from Oracle to MySQL 【发布时间】:2021-08-26 17:09:18 【问题描述】:

我正在尝试使用 cx_Oracle 和 SQL Alchemy 执行从 Oracle 到 MySQL 的批量提取/加载。

我在网上找到了这个示例,它适用于大多数数据类型,但在 Blob 数据类型中失败:

https://vbaoverall.com/transfer-data-from-oracle-to-mysql-using-sqlalchemy-python/

我有大约 43 个表,其中大约 12 个有 BLOB 数据类型。

import cx_Oracle
import pandas as pd
from sqlalchemy import create_engine
import pymysql
import warnings

warnings.filterwarnings('ignore')

# list out all 43 tables:
table_list = [
    "FILE",
    "ATTACHMENT",
    "DOCUMENTS",
    "USERS",
    "INFO",
    "ONE",
    "TWO",
    "THREE",
    "FOUR",
    "...."
]

# Set Oralce Connection
dsn_tns = cx_Oracle.makedsn('source.example.com', '1530', service_name='test')
oracle_connection = cx_Oracle.connect(user='root', password='toot', dsn=dsn_tns)

# Open Oracle cursor
cursor = oracle_connection.cursor()

# set mysql connection with foreign key checks
mysql_engine = create_engine("mysql+pymysql://root:toot@target.example.com:3306/target")
mysql_engine.execute("SET FOREIGN_KEY_CHECKS=0")

# loop thru tables:
for table in table_list:

    # select from oracle
    sql = "SELECT * FROM " + table

    # read into pandas df
    data=pd.read_sql(sql, oracle_connection)

    # insert into mysql
    mysql_engine.execute("TRUNCATE TABLE "+table)
    data.to_sql(table, con=mysql_engine, if_exists='append', index=False, chunksize=10000)
    print(": sucessfully inserted  rows.".format(table, data.shape[0]))

# update foreign key checks
mysql_engine.execute("SET FOREIGN_KEY_CHECKS=1")

#close connection
oracle_connection.close()
mysql_engine.dispose()

这是我得到的错误:

return "'%s'" % escape_string(str(value), mapping)
TypeError: __str__ returned non-string (type bytes)

【问题讨论】:

您是否尝试过使用to_sql()dtype= 参数来显式设置列类型? 我在尝试这个时收到了一个不同的错误:dtype = dtype['FILE_CONTENT'] = sqlalchemy.types.BLOB 我尝试了BLOBBINARY 并收到了这个错误:sqlalchemy.exc.StatementError: (builtins.TypeError) cannot convert 'cx_Oracle.LOB' object to bytes 实际上,当我将类型更改为PickleType 时,它起作用了。谢谢@GordThompson 【参考方案1】:

感谢@Gord Thompson,我发现我只需要指定dtype=

import cx_Oracle
import pandas as pd
from sqlalchemy import create_engine
import sqlalchemy
import pymysql
import warnings

warnings.filterwarnings('ignore')

table_list = [
    "FILE",
    "ATTACHMENT",
    "DOCUMENTS",
    "USERS",
    "INFO",
    "ONE",
    "TWO",
    "THREE",
    "FOUR",
    "...."
]

# Set Oralce Connection
dsn_tns = cx_Oracle.makedsn('source.example.com', '1530', service_name='test')
oracle_connection = cx_Oracle.connect(user='root', password='toot', dsn=dsn_tns)

# Open Oracle cursor
cursor = oracle_connection.cursor()

# set mysql connection with foreign key checks
mysql_engine = create_engine("mysql+pymysql://root:toot@target.example.com:3306/target")
mysql_engine.execute("SET FOREIGN_KEY_CHECKS=0")

for table in table_list:

    # select from oracle
    sql = "SELECT * FROM " + table

    # read into pandas df
    data=pd.read_sql(sql, oracle_connection)

    dtype = 
    if table == "ATTACHMENT":
        dtype['FILE_CONTENT'] = sqlalchemy.types.PickleType

    # insert into mysql
    mysql_engine.execute("TRUNCATE TABLE "+table)
    data.to_sql(table, con=mysql_engine, if_exists='append', index = False, chunksize =10000, dtype=dtype)
    print(": sucessfully inserted  rows.".format(table, data.shape[0]))

# update foreign key checks
mysql_engine.execute("SET FOREIGN_KEY_CHECKS=1")

#close connection
oracle_connection.close()
mysql_engine.dispose()

【讨论】:

SQL Alchemy - 从一个实体上的多个一对一关系中删除孤儿[关闭]

】SQLAlchemy-从一个实体上的多个一对一关系中删除孤儿[关闭]【英文标题】:SQLAlchemy-deleteorphanfrommultipleonetoonerelationshipsononeentity[closed]【发布时间】:2021-10-3104:00:57【问题描述】:我在一张表上定义了这两个一对一的关系。home_lin... 查看详情

怎么从oracle迁移到sqlserver?

...出工具)一个一个的迁移3.写脚本,这个没怎么写过,sql到oracle倒是写过,因为一般是从sql迁到oracle,很少反向的,这个用bcp导出,sqlldr导入参考技术A现在建议你用goldengate,很简单也很快 参考技术B在网上找找应该有挺多类似的转... 查看详情

使用 SQL Alchemy 和 pymssql 指定故障转移伙伴

】使用SQLAlchemy和pymssql指定故障转移伙伴【英文标题】:SpecifyFailoverPartnerwithSQLAlchemyandpymssql【发布时间】:2017-05-0114:59:36【问题描述】:有谁知道如何从SQLAlchemy和pymssql指定FailoverPartner连接到SQLServer?尝试关注SQLAlchemydocumentation... 查看详情

在 SQL Alchemy ORM 中使用辅助连接

】在SQLAlchemyORM中使用辅助连接【英文标题】:UsingsecondaryjoinsintheSQLAlchemyORM【发布时间】:2014-08-0815:13:57【问题描述】:我正在尝试建立从一个表到另外两个表的辅助多对多关系,通过中间的第三个链接到所有三个表。我有两个... 查看详情

将 dateadd 和 datepart 从 sybase 迁移到 oracle

】将dateadd和datepart从sybase迁移到oracle【英文标题】:migratedateaddanddatepartfromsybasetooracle【发布时间】:2022-01-0201:28:02【问题描述】:我试过把这句话sql从sybase迁移到oracle但是现在不知道怎么实现dateadd和datepart。select@v_date=convert(char... 查看详情

从 Oracle 到 MySQL 的大数据迁移

】从Oracle到MySQL的大数据迁移【英文标题】:BigdatamigrationfromOracletoMySQL【发布时间】:2014-04-0605:13:12【问题描述】:我从一家零售商那里收到了超过100GB的数据,其中包含6700万条记录。我的目标是做一些市场篮子分析和CLV。此数... 查看详情

从嵌入式 SQL 迁移到 ODBC 的工具 [关闭]

...:26:14【问题描述】:我有一堆通过嵌入式SQL访问数据库(Oracle、DB2和Sybase)的C代码:基本代码是相同的,但是使用三种不同的预编译器,构建了三种可执行文件,每个数据库/平台一个。我工作得很好,但我们现在需要迁移到使... 查看详情

ORM查询多对多一,Flask sql-alchemy

】ORM查询多对多一,Flasksql-alchemy【英文标题】:ORMquerymanytomanytoone,Flasksql-alchemy【发布时间】:2021-04-1410:13:23【问题描述】:我有三个烧瓶sqlalchemy模型。Books-管理员的唯一条目:classBook(db.Model):id=db.Column(db.Integer,primary_key=True,autoi... 查看详情

SQL Alchemy - 事务不工作

】SQLAlchemy-事务不工作【英文标题】:SQLAlchemy-Transactionisn\'tworking【发布时间】:2016-03-1518:43:30【问题描述】:我使用的是SQLAlchemy核心版本1.1,但我似乎无法在我的falcon(python)应用程序中进行事务处理。据我所知,我正确地遵循... 查看详情

如何获取受 SQL Alchemy 影响的行数?

】如何获取受SQLAlchemy影响的行数?【英文标题】:HowdoIgetthenumberofrowsaffectedwithSQLAlchemy?【发布时间】:2012-10-0109:45:55【问题描述】:如何使用sqlalchemy获取更新语句受影响的行数?(我正在使用mysql和python/pyramid):fromsqlalchemy.engi... 查看详情

从 SQL Azure 迁移到 SQL Server

】从SQLAzure迁移到SQLServer【英文标题】:MigratingfromSQLAzuretoSQLServer【发布时间】:2012-09-0414:47:59【问题描述】:众所周知,有很多工具可以将数据库从SQL服务器迁移到带有架构和数据的SQLAzure。但是有没有办法将SQLAzure数据库迁移... 查看详情

需要将以下存储过程从 Oracle 转换为 SQL

】需要将以下存储过程从Oracle转换为SQL【英文标题】:NeedtoconvertbelowstoredprocedurefromOracletoSQL【发布时间】:2018-07-1908:10:06【问题描述】:我需要将下面的存储过程从Oracle转换为SQL,我尝试通过SqlSever迁移助手进行转换,但无法转... 查看详情

带有条件的 sql-alchemy 选择中的唯一元素

】带有条件的sql-alchemy选择中的唯一元素【英文标题】:uniqueelementsinsql-alchemyselectionwithcondition【发布时间】:2015-08-0323:29:08【问题描述】:我有一个名为votes的表,它存储用户的投票。该表存储user_id、group_id、投票的时间戳和用... 查看详情

Flyway 迁移 Oracle PL/SQL 转储

【中文标题】Flyway迁移OraclePL/SQL转储【英文标题】:FlywaymigrateOraclePL/SQLdump【发布时间】:2012-07-2721:07:15【问题描述】:Flyway提供了oraclepl/sql解析器,那么是否可以使用pl/sql转储(.pde)进行迁移?【问题讨论】:【参考方案1】:转... 查看详情

从暴露的 orm 表生成 SQL 迁移

】从暴露的orm表生成SQL迁移【英文标题】:GenerateSQLmigrationsfromexposedormtable【发布时间】:2021-12-2218:28:27【问题描述】:我想知道如何从使用ExposedORM创建的表中生成SQL脚本迁移。这对我很有帮助,因为我可以在以后使用Flyway应用... 查看详情

如何在 Sql Alchemy Python 中为 MS SQL 后端指定事务隔离级别

】如何在SqlAlchemyPython中为MSSQL后端指定事务隔离级别【英文标题】:HowdoIspecifyTransactionIsolationLevelforMSSQLbackendinSqlAlchemyPython【发布时间】:2016-03-0823:30:29【问题描述】:如何为通过SQLAlchemy引擎对象完成的所有查询设置事务级别REA... 查看详情

使用blob在python中将pdf上传到sql-alchemy

】使用blob在python中将pdf上传到sql-alchemy【英文标题】:Uploadingpdftosql-alchemyinpythonusingblob【发布时间】:2021-12-3017:50:35【问题描述】:我正在尝试以pdf的形式将书籍上传到sqlite3。我写了这个上传的代码:作者标题故事的pdf,但blob... 查看详情

从迁移中显示 Laravel SQL

】从迁移中显示LaravelSQL【英文标题】:ShowLaravelSQLfrommigation【发布时间】:2013-06-1203:10:10【问题描述】:有没有办法显示Laravel-4将针对给定迁移的数据库运行的实际SQL?我想在实际将其提交到数据库之前看看它的行为。【问题讨... 查看详情