Как вставить pandas dataframe через mysqldb в базу данных?
Я могу подключиться к моей локальной базе данных mysql из python, и я могу создавать, выбирать и вставлять отдельные строки.
Мой вопрос: могу ли я напрямую поручить mysqldb взять весь фрейм данных и вставить его в существующую таблицу или мне нужно перебирать строки?
В любом случае, как выглядел бы python script для очень простой таблицы с идентификатором и двумя столбцами данных и с соответствующим фреймворком данных?
Ответы
Ответ 1
Обновить:
Теперь есть метод to_sql
, который является предпочтительным способом сделать это, а не write_frame
:
df.to_sql(con=con, name='table_name_for_df', if_exists='replace', flavor='mysql')
Также обратите внимание: синтаксис может измениться в пандах 0.14...
Вы можете установить соединение с MySQLdb:
from pandas.io import sql
import MySQLdb
con = MySQLdb.connect() # may need to add some other options to connect
Если установить для flavor
write_frame
значение 'mysql'
вы можете писать в mysql:
sql.write_frame(df, con=con, name='table_name_for_df',
if_exists='replace', flavor='mysql')
Аргумент if_exists
сообщает pandas, как поступать, если таблица уже существует:
if_exists: {'fail', 'replace', 'append'}
, по умолчанию 'fail'
fail
: если таблица существует, ничего не делать.
replace
: если таблица существует, удалите ее, создайте заново и вставьте данные.
append
: если таблица существует, вставьте данные. Создать, если не существует.
Хотя документы write_frame
настоящее время предполагают, что он работает только на sqlite, mysql, по-видимому, поддерживается, и на самом деле в базе кода довольно много тестирований mysql.
Ответ 2
Энди Хейден упомянул правильную функцию ( to_sql
). В этом ответе я приведу полный пример, который я тестировал на Python 3.5, но также должен работать на Python 2.7 (и Python 3.x):
Сначала давайте создадим фрейм данных:
# Create dataframe
import pandas as pd
import numpy as np
np.random.seed(0)
number_of_samples = 10
frame = pd.DataFrame({
'feature1': np.random.random(number_of_samples),
'feature2': np.random.random(number_of_samples),
'class': np.random.binomial(2, 0.1, size=number_of_samples),
},columns=['feature1','feature2','class'])
print(frame)
Который дает:
feature1 feature2 class
0 0.548814 0.791725 1
1 0.715189 0.528895 0
2 0.602763 0.568045 0
3 0.544883 0.925597 0
4 0.423655 0.071036 0
5 0.645894 0.087129 0
6 0.437587 0.020218 0
7 0.891773 0.832620 1
8 0.963663 0.778157 0
9 0.383442 0.870012 0
Чтобы импортировать этот фрейм данных в таблицу MySQL:
# Import dataframe into MySQL
import sqlalchemy
database_username = 'ENTER USERNAME'
database_password = 'ENTER USERNAME PASSWORD'
database_ip = 'ENTER DATABASE IP'
database_name = 'ENTER DATABASE NAME'
database_connection = sqlalchemy.create_engine('mysql+mysqlconnector://{0}:{1}@{2}/{3}'.
format(database_username, database_password,
database_ip, database_name))
frame.to_sql(con=database_connection, name='table_name_for_df', if_exists='replace')
Одна хитрость в том, что MySQLdb не работает с Python 3.x. Поэтому вместо этого мы используем mysqlconnector
, который может быть установлен следующим образом:
pip install mysql-connector==2.1.4 # version avoids Protobuf error
Выход:
![enter image description here]()
Обратите внимание, что to_sql
создает таблицу и столбцы, если они еще не существуют в базе данных.
Ответ 3
Вы можете сделать это, используя pymysql:
Например, предположим, что у вас есть база данных MySQL со следующим пользователем, паролем, хостом и портом, и вы хотите записать в базу данных "data_2", , если она уже есть или нет..
import pymysql
user = 'root'
passw = 'my-secret-pw-for-mysql-12ud'
host = '172.17.0.2'
port = 3306
database = 'data_2'
Если у вас уже создана база данных:
conn = pymysql.connect(host=host,
port=port,
user=user,
passwd=passw,
db=database,
charset='utf8')
data.to_sql(name=database, con=conn, if_exists = 'replace', index=False, flavor = 'mysql')
Если у вас нет созданной базы данных, также действительна, когда база данных уже существует:
conn = pymysql.connect(host=host, port=port, user=user, passwd=passw)
conn.cursor().execute("CREATE DATABASE IF NOT EXISTS {0} ".format(database))
conn = pymysql.connect(host=host,
port=port,
user=user,
passwd=passw,
db=database,
charset='utf8')
data.to_sql(name=database, con=conn, if_exists = 'replace', index=False, flavor = 'mysql')
Похожие темы:
Ответ 4
Вы можете вывести свой DataFrame
как файл csv, а затем использовать mysqlimport
для импорта вашего csv в свой mysql
.
ИЗМЕНИТЬ
Кажется, pandas встроенный sql util предоставляет функцию write_frame
, но работает только в sqlite.
Я нашел что-то полезное, вы можете попробовать this
Ответ 5
Метод to_sql работает для меня.
Однако имейте в виду, что похоже, что это будет устаревшим в пользу SQLAlchemy:
FutureWarning: The 'mysql' flavor with DBAPI connection is deprecated and will be removed in future versions. MySQL will be further supported with SQLAlchemy connectables. chunksize=chunksize, dtype=dtype)
Ответ 6
Python 2 + 3
Prerequesites
- Pandas
- Сервер MySQL
- SQLAlchemy
- pymysql: чистый клиент python mysql
Код
from pandas.io import sql
from sqlalchemy import create_engine
engine = create_engine("mysql+pymysql://{user}:{pw}@localhost/{db}"
.format(user="root",
pw="your_password",
db="pandas"))
df.to_sql(con=engine, name='table_name', if_exists='replace')
Ответ 7
df.to_sql (name = "owner", con = db_connection, schema = 'aws', if_exists = 'replace', index => True, index_label = 'id')