to_sql seleccionar data columnas columna agregar python mysql pandas mysql-python

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)


Puede generar su DataFrame como un archivo csv y luego usar mysqlimport para importar su csv a su mysql .

EDITAR

Parece que la write_frame sql write_frame pandas proporciona una función write_frame pero solo funciona en sqlite.

Encontré algo útil, podrías intentar this


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:

  1. Escribiendo en la base de datos MySQL con pandas usando SQLAlchemy, to_sql
  2. Escribiendo un Dataframe de Pandas a MySQL