python - seleccionar - ¿Cómo insertar pandas dataframe a través de mysqldb en la base de datos?
pandas to_sql (6)
Python 2 + 3
Prerrequisitos
- Pandas
- Servidor MySQL
- sqlalchemy
- pymysql : cliente mysql de python puro
Código
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'')
Puedo conectarme a mi base de datos mysql local desde Python, y puedo crear, seleccionar e insertar filas individuales.
Mi pregunta es: ¿puedo instruir directamente a mysqldb para que tome un marco de datos completo y lo inserte en una tabla existente, o tengo que recorrer las filas?
En cualquier caso, ¿qué aspecto tendría el script de Python para una tabla muy simple con ID y dos columnas de datos, y un marco de datos coincidente?
Actualizar:
Ahora hay un método to_sql
, que es la forma preferida de hacer esto, en lugar de write_frame
:
df.to_sql(con=con, name=''table_name_for_df'', if_exists=''replace'', flavor=''mysql'')
También tenga en cuenta: la sintaxis puede cambiar en pandas 0.14 ...
Puedes configurar la conexión con MySQLdb :
from pandas.io import sql
import MySQLdb
con = MySQLdb.connect() # may need to add some other options to connect
Establecer el flavor
de write_frame
en ''mysql''
significa que puede escribir en mysql:
sql.write_frame(df, con=con, name=''table_name_for_df'',
if_exists=''replace'', flavor=''mysql'')
El argumento if_exists
le dice a pandas cómo tratar si la tabla ya existe:
if_exists: {''fail'', ''replace'', ''append''}
, por defecto''fail''
fail
: si la tabla existe, no haga nada.
replace
: si la tabla existe, suéltela, vuelva a crearla e inserte datos.
append
: si la tabla existe, inserte los datos. Crear si no existe.
Aunque los documentos de write_frame
actualmente sugieren que solo funciona en sqlite, mysql parece ser compatible y, de hecho, hay un poco de pruebas de mysql en el código base .
Andy Hayden mencionó la función correcta ( to_sql
). En esta respuesta, daré un ejemplo completo, que probé con Python 3.5, pero también debería funcionar para Python 2.7 (y Python 3.x):
Primero, vamos a crear el marco de datos:
# 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)
Lo que da:
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
Para importar este marco de datos en una tabla 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'')
Un truco es que MySQLdb no funciona con Python 3.x. Entonces, en lugar de eso, usamos mysqlconnector
, que puede installed siguiente manera:
pip install mysql-connector==2.1.4 # version avoids Protobuf error
Salida:
Tenga en cuenta que to_sql
crea la tabla así como las columnas si aún no existen en la base de datos.
El método to_sql funciona para mí.
Sin embargo, tenga en cuenta que parece que va a quedar en desuso en favor de 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)
Puedes hacerlo usando pymysql:
Por ejemplo, supongamos que tiene una base de datos MySQL con el siguiente usuario, contraseña, host y puerto y desea escribir en la base de datos ''data_2'', si ya está allí o no .
import pymysql
user = ''root''
passw = ''my-secret-pw-for-mysql-12ud''
host = ''172.17.0.2''
port = 3306
database = ''data_2''
Si ya tiene la base de datos creada :
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'')
Si NO tiene la base de datos creada , también es válida cuando la base de datos ya está allí:
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'')
Hilos similares: