在 Python 3.6 中使用 pandas.to_sql 将外来(非 ASCII)字符写入 Oracle DB

Joe*_*ron 5 python oracle encoding pandas

pandas.DataFrame我在将包含非 ASCII 字符的值写入 Oracle 数据库时遇到困难。这是一个可重现的示例(给定真实的连接字符串):

\n\n
import pandas as pd\nfrom sqlalchemy import create_engine, Unicode, NVARCHAR\n\nconnection_string = oracle://<name>:<password>@<database>'\n\ndf = pd.DataFrame([\n        ['Soci\xc3\xa9t\xc3\xa9 G\xc3\xa9n\xc3\xa9rale']\n    ], columns=['firm'])\n\nconn = create_engine(connection_string, encoding='utf-8')\ndtypes = {'firm': Unicode(40)}\n\ndf.to_sql('test', con=connection_string, dtype=dtypes, if_exists='replace')\n
Run Code Online (Sandbox Code Playgroud)\n\n

产生的错误看起来像

\n\n
UnicodeEncodeError: 'ascii' codec can't encode character '\\xe9' in position 4: ordinal not in range(128)\n
Run Code Online (Sandbox Code Playgroud)\n\n

我想问题是如何让它在写入时使用UTF-8编码。encoding我知道in的默认值create_engineutf-8',我认为它会控制使用的编码。\n我也尝试过dtypes = {'firm': NVARCHAR(40, convert_unicode=True)},但遇到了同样的错误。

\n\n

我尝试在写入 ( ) 之前对数据进行编码,df['firm'] = df.firms.str.encode('utf-8')这确实解决了这个问题,但结果却导致了更大的问题。

\n\n

这似乎是一个简单的问题,但我花了几个小时查看文档和 SO,但不知道该怎么做。

\n\n

使用的版本是;Python: 3.6, pandas: 0.20,sqlalchemy: 1.11

\n

mbe*_*ski 4

这是一个老问题,但我最近一直在努力解决同样的问题,并找到了一个对我有用的解决方案。

我必须设置

os.environ['NLS_LANG'] = ".AL32UTF8"
Run Code Online (Sandbox Code Playgroud)

这对我有用。但是我发现插入数据非常慢。