MySql Команды не синхронизированы c при сохранении результата хранимой процедуры в кадре данных - PullRequest
0 голосов
/ 23 марта 2020

Я пытаюсь импортировать данные из базы данных MySql в pandas фрейм данных, вызывая хранимую процедуру.

Но я получаю следующую ошибку, которую я не понимаю после создания исключения кажется, что данные на самом деле в кадре данных. Так как я могу избавиться от этого исключения?

import pandas as pd
from sqlalchemy import create_engine

import_data_query = "CALL my_scheme.my_procedure(NULL);"

connection_string = "mysql+mysqlconnector://***:***@localhost/my_scheme"

engine = create_engine(connection_string)

df = pd.read_sql_query(sql=import_data_query, con=engine)

engine.dispose()

Исключение, которое я получаю:

Exception during reset or similar
Traceback (most recent call last):
  File "C:\Users\*\anaconda3\lib\site-packages\sqlalchemy\pool\base.py", line 693, in _finalize_fairy
    fairy._reset(pool)
  File "C:\Users\*\anaconda3\lib\site-packages\sqlalchemy\pool\base.py", line 880, in _reset
    pool._dialect.do_rollback(self)
  File "C:\Users\*\anaconda3\lib\site-packages\sqlalchemy\dialects\mysql\base.py", line 2302, in do_rollback
    dbapi_connection.rollback()
  File "C:\Users\*\anaconda3\lib\site-packages\mysql\connector\connection_cext.py", line 386, in rollback
    self._cmysql.rollback()
_mysql_connector.MySQLInterfaceError: Commands out of sync; you can't run this command now

1 Ответ

1 голос
/ 23 марта 2020

Для хранимых процедур вам необходимо использовать объект подключения для SQLAlchemy docs для доступа callproc:

conn = engine.raw_connection()
cur = conn.cursor()

res = cur.callproc("my_procedure", args=(None,))   # None SHOULD TRANSLATE AS NULL
df = pd.DataFrame(results, columns = [i[0] for i in res.description])

В качестве альтернативы, напрямую взаимодействовать с БД -API, здесь существо MySQL.connector:

import mysql.connector

myconn = mysql.connector.connect(host='localhost', database='mydatabase',
                                 user='***', password='***')
mycur = myconn.cursor()

results = mycur.callproc("my_procedure", args=(None,))
df = pd.DataFrame(results, columns=[i[0] for i in results.description])

mycur.close()
myconn.close()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...