一、tosql成了clob格式
在使用to_sql时,很多人不知道如何避免出现错误“ORA-01460: unimplemented or unreasonable conversion requested”。原因是ORACLE数据库对CLOB/BLOB类型的处理有些许不同于其他数据库。
以下示例为使用pandas将数据写入ORACLE数据库的示例。当数据库中存在CLOB类型字段时,to_sql会自动将数据转换为CLOB格式。当数据量达到一定规模时出现了“ORA-01460: unimplemented or unreasonable conversion requested”的错误提示。
import pandas as pd from sqlalchemy import create_engine # 创建数据库链接 engine = create_engine('oracle://user:password@host:port/database') # 创建一个数据框 df = pd.DataFrame({'col1': [1, 2], 'col2': ['abc', 'def'], 'col3': ['aaa' * 1000000, 'bbb' * 1000000]}) # 因为数据类型为CLOB,所以无需设置dtype df.to_sql(name='table_name', con=engine, if_exists='replace')
解决方案非常简单,只需要将dtype设置为字符串类型即可解决该问题。修改如下:
# 设置dtype df = pd.DataFrame({'col1': [1, 2], 'col2': ['abc', 'def'], 'col3': ['aaa' * 1000000, 'bbb' * 1000000]}, dtype=str) # 写入数据库 df.to_sql(name='table_name', con=engine, if_exists='replace')
二、tosql提示expecting number
在to_sql操作中,如果我们直接将float类型字段写入数据库,可能会遇到“Invalid data type”或者“ORA-01722:invalid number”等类型的错误。
这是因为在写入数据时,pandas通过to_sql()方法将数据类型转换为了VARCHAR2类型,而ORACLE数据库要求float类型存储在NUMBER类型中。因此,我们需要手动指定数据类型,将float类型转换为NUMBER。
# 创建一个数据框 df = pd.DataFrame({'col1': [1.0, 2.0], 'col2': [3.0, 4.0]}) # 设置数据类型 dtype = {'col1': 'NUMBER', 'col2': 'NUMBER'} # 写入数据库 df.to_sql(name='table_name', con=engine, if_exists='replace', dtype=dtype)
三、其他常见问题
1. 如何不写入索引?
在写入数据到数据库时,to_sql()方法默认会将索引写入数据库中。当我们不需要索引时,可以通过将index参数设置为False来避免该问题。
# 写入数据,不包含索引 df.to_sql(name='table_name', con=engine, if_exists='replace', index=False)
2. 如何自定义字段名并且保持大小写?
to_sql()方法默认将字段名转换为大写,即便我们在数据框中设置了小写的字段名。如果我们需要在数据库中保留字段名的大小写,需要通过设置flavor为oracle来实现。
# 自定义字段名,保持大小写 df = pd.DataFrame({'id': [1, 2], 'name': ['A', 'B']}) df.to_sql(name='table_name', schema=schema, con=engine, if_exists='replace', flavor='oracle')
3. 如何将多个数据框写入同一张表格中?
如果我们需要将多个数据框写入同一张表格中,则需要通过设置if_exists为“append”来实现。需要注意的是,每个数据框的字段必须保持一致。
# 创建一个数据框1 df1 = pd.DataFrame({'col1': [1, 2], 'col2': ['abc', 'def'], 'col3': ['aaa', 'bbb']}) # 创建一个数据框2 df2 = pd.DataFrame({'col1': [3, 4], 'col2': ['xyz', 'uvw'], 'col3': ['ccc', 'ddd']}) # 将两个数据框写入同一张表格中 df1.to_sql(name='table_name', con=engine, if_exists='append', index=False) df2.to_sql(name='table_name', con=engine, if_exists='append', index=False)
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/270281.html