Как вставить Pandas dataframe через mysqldb в базу данных?

Я могу подключиться к моей локальной базе данных mysql из python, и я могу создавать, выбирать и вставлять отдельные строки.

мой вопрос: Могу ли я напрямую поручить mysqldb взять всю таблицу данных и вставить его в существующую таблицу, или мне нужно перебрать строки?

в любом случае, как будет выглядеть скрипт python для очень простой таблицы с ID и двумя столбцами данных и соответствующим фреймом данных?

6 ответов


обновление:

сейчас to_sql метод, который является предпочтительным способом сделать это, а не write_frame:

df.to_sql(con=con, name='table_name_for_df', if_exists='replace', flavor='mysql')

Также обратите внимание: синтаксис может измениться в pandas 0.14...

вы можете настроить соединение с MySQLdb:

from pandas.io import sql
import MySQLdb

con = MySQLdb.connect()  # may need to add some other options to connect

задание flavor of write_frame до 'mysql' означает, что вы можете написать mysql:

sql.write_frame(df, con=con, name='table_name_for_df', 
                if_exists='replace', flavor='mysql')

аргумент if_exists говорит панд как поступить, если таблица уже существует:

if_exists: {'fail', 'replace', 'append'} по умолчанию 'fail'
     fail: если таблица существует, ничего не делайте.
     replace: если таблица существует, удалите ее, воссоздайте и вставьте данные.
     append: если таблица существует, вставьте данные. Создать, если не существует.

хотя write_frame docs в настоящее время предполагают, что он работает только на sqlite, mysql, похоже, поддерживается и в то есть совсем немного тестирование mysql в кодовой базе.


Энди Хейден упомянул правильную функцию (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.х. Так что вместо этого мы используем mysqlconnector, может быть установлен следующим образом:

pip install mysql-connector==2.1.4  # version avoids Protobuf error

выход:

enter image description here

отметим, что to_sql создает таблицу, а также столбцы, если они еще не существуют в базе данных.


вы можете вывести свой DataFrame Как csv-файл, а затем использовать mysqlimport чтобы импортировать csv в ваш mysql.

редактировать

кажется сборка панд в sql util обеспечить write_frame функция, но работает только в sqlite.

Я нашел что-то полезное, вы можете попробовать этой


метод 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)

Python 2 + 3

Prerequesites

  • панды
  • сервер MySQL
  • sqlalchemy
  • pymysql: pure python mysql client

код

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')

вы можете сделать это с помощью 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')

Похожие темы:

  1. запись в базу данных MySQL с пандами с помощью SQLAlchemy, to_sql
  2. написание фрейма данных Pandas в MySQL