pandas dataframe.to_sql 写入 MariaDB 时抛出错误

N. *_*aks 1 python sqlalchemy mariadb pandas

当我尝试执行下面的代码时,mariadb.ProgrammingError: Cursor is closed即使数据已成功写入数据库,python 也会给我一个 。我猜想返回行计数有问题(请参阅下面的完整回溯)。这是一个可能的错误还是我错过了什么?

代码示例

import pandas as pd
from sqlalchemy import create_engine
conn_str = 'mariadb+mariadbconnector://user:password@localhost:3306/database_name'
engine = create_engine(conn_str)
df = pd.DataFrame(data={'col1': [1, 2, 3], 'col2': ['A', 'B', 'C']})
df.to_sql('pandas_test_table', index=False, con=engine, if_exists='replace')
Run Code Online (Sandbox Code Playgroud)

追溯

Traceback (most recent call last):
  File "C:\Program Files\Python310\lib\code.py", line 90, in runcode
    exec(code, self.locals)
  File "<input>", line 1, in <module>
  File "C:\Users\user\AppData\Roaming\Python\Python310\site-packages\pandas\core\generic.py", line 2951, in to_sql
    return sql.to_sql(
  File "C:\Users\user\AppData\Roaming\Python\Python310\site-packages\pandas\io\sql.py", line 697, in to_sql
    return pandas_sql.to_sql(
  File "C:\Users\user\AppData\Roaming\Python\Python310\site-packages\pandas\io\sql.py", line 1739, in to_sql
    total_inserted = sql_engine.insert_records(
  File "C:\Users\user\AppData\Roaming\Python\Python310\site-packages\pandas\io\sql.py", line 1322, in insert_records
    return table.insert(chunksize=chunksize, method=method)
  File "C:\Users\user\AppData\Roaming\Python\Python310\site-packages\pandas\io\sql.py", line 950, in insert
    num_inserted = exec_insert(conn, keys, chunk_iter)
  File "C:\Users\user\AppData\Roaming\Python\Python310\site-packages\pandas\io\sql.py", line 858, in _execute_insert
    return result.rowcount
  File "C:\Users\user\AppData\Roaming\Python\Python310\site-packages\sqlalchemy\util\langhelpers.py", line 1113, in __get__
    obj.__dict__[self.__name__] = result = self.fget(obj)
  File "C:\Users\user\AppData\Roaming\Python\Python310\site-packages\sqlalchemy\engine\cursor.py", line 1691, in rowcount
    self.cursor_strategy.handle_exception(self, self.cursor, e)
  File "C:\Users\user\AppData\Roaming\Python\Python310\site-packages\sqlalchemy\engine\cursor.py", line 846, in handle_exception
    raise err
  File "C:\Users\user\AppData\Roaming\Python\Python310\site-packages\sqlalchemy\engine\cursor.py", line 1689, in rowcount
    return self.context.rowcount
  File "C:\Users\user\AppData\Roaming\Python\Python310\site-packages\sqlalchemy\engine\default.py", line 1439, in rowcount
    return self.cursor.rowcount
  File "C:\Users\user\AppData\Roaming\Python\Python310\site-packages\mariadb\cursors.py", line 541, in rowcount
    self.check_closed()
  File "C:\Users\user\AppData\Roaming\Python\Python310\site-packages\mariadb\cursors.py", line 55, in check_closed
    raise mariadb.ProgrammingError("Cursor is closed")
mariadb.ProgrammingError: Cursor is closed
Run Code Online (Sandbox Code Playgroud)

封装版本

mariadb==1.1.4
pandas==1.4.3
SQLAlchemy==1.4.40
Run Code Online (Sandbox Code Playgroud)

Ale*_*Box 8

我尝试了 Georg Richter 关于从源安装 MariaDB 1.1.5 或回滚到 1.1.3 的建议,但仍然收到错误消息。

最终,我发现了这个文档,并将引擎 DBAPI 从

uri = 'mariadb+mariadbconnector://Username:Password@localhost/test'
Run Code Online (Sandbox Code Playgroud)

uri = 'mariadb+pymysql://Username:Password@localhost/test'
Run Code Online (Sandbox Code Playgroud)

它奏效了。