Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 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')