Извлекать данные из базы данных mysql, используя библиотеку Python' odo
Мне нужно извлечь данные из базы данных MySQL в фрейм данных Pandas, используя библиотеку odo в Python. Документация Odo предоставляет только информацию о передаче имени таблицы для извлечения данных, но как мне передать строку запроса SQL, которая извлекает необходимые данные из базы данных.
Следующий код работает:
импорт одо
импортировать панд как pd
data = odo ('mysql + pymysql: // имя пользователя:{0}@localhost/dbname::{1}'.format('пароль', 'table_name'), pd.DataFrame)
Но как мне передать строку SQL вместо имени таблицы. Потому что мне нужно объединить несколько других таблиц, чтобы получить необходимые данные.
1 ответ
Передача строки непосредственно в odo не поддерживается модулем. Существует три способа перемещения данных с использованием перечисленных инструментов.
Сначала создайте SQL-запрос в виде строки и прочитайте, используя:
data = pandas.read_sql_query(sql, con, index_col=None,
coerce_float=True, params=None,
parse_dates=None, chunksize=None)[source]
ссылка http://pandas.pydata.org/pandas-docs/version/0.20/generated/pandas.read_sql_query.html
Во-вторых, использование метода odo требует запуска запроса в словарь, а затем использовать словарь в структуре odo (источник, назначение).
cursor.execute(sql)
results = db.engine.execute(sql)
data = odo(results, pd.DataFrame)
см. стр. 30 из https://media.readthedocs.org/pdf/odo/latest/odo.pdf
ref Как выполнить сырой SQL в приложении SQLAlchemy-flask
ref cursor.fetchall () против списка (курсор) в Python
Наконец, чтобы увеличить скорость выполнения, рассмотрите добавление фрейма данных pandas для каждого результата в результатах.
result = db.engine.execute(sql).fetchone()
data = pd.DataFrame(index=index, columns=list('AB'))
data = df_.fillna(0) # with 0s rather than NaNs
while result is not None:
dataappend = pd.DataFrame(result, columns=list('AB'))
data.append(dataappend)
result = db.engine.execute(sql).fetchone()
ссылка https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.append.html
ref Создание пустого Pandas DataFrame, а затем его заполнение?