如何通过mysqldb将pandas数据帧插入数据库?

Ste*_*fan 41 python mysql mysql-python pandas

我可以从python连接到我的本地mysql数据库,我可以创建,选择和插入单个行.

我的问题是:我可以直接指示mysqldb获取整个数据帧并将其插入现有表中,还是我需要遍历行?

在任何一种情况下,对于一个包含ID和两个数据列以及匹配数据帧的非常简单的表,python脚本会是什么样子?

And*_*den 79

更新:

现在有一种to_sql方法,这是执行此操作的首选方法,而不是write_frame:

df.to_sql(con=con, name='table_name_for_df', if_exists='replace', flavor='mysql')
Run Code Online (Sandbox Code Playgroud)

另请注意:pandas 0.14中的语法可能会改变...

您可以设置与MySQLdb的连接:

from pandas.io import sql
import MySQLdb

con = MySQLdb.connect()  # may need to add some other options to connect
Run Code Online (Sandbox Code Playgroud)

设置flavorwrite_frame,以'mysql'意味着您可以编写到MySQL:

sql.write_frame(df, con=con, name='table_name_for_df', 
                if_exists='replace', flavor='mysql')
Run Code Online (Sandbox Code Playgroud)

if_exists如果表已经存在,该参数告诉pandas如何处理:

if_exists: {'fail', 'replace', 'append'},默认'fail'
     fail:如果表存在,则不执行任何操作.
     replace:如果表存在,则删除它,重新创建它并插入数据.
     append:如果表存在,则插入数据.创建如果不存在.

虽然write_frame文档目前建议它只适用于sqlite,但似乎支持mysql,实际上在代码库中有相当多的mysql测试.

  • Andy - 关于如何使用pandas 0.20.2贬低'mysql'味道的任何想法? (5认同)
  • @pshep123 使用 SQLAlchemy:/sf/answers/2145779191/ /sf/answers/2054981211/ https://pandas.pydata.org/pandas-docs/stable/io.html #engine-connection-examples(引擎而不是连接) (2认同)

Fra*_*urt 16

安迪海登提到了正确的功能(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)
Run Code Online (Sandbox Code Playgroud)

这使:

   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
Run Code Online (Sandbox Code Playgroud)

要将此数据帧导入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')
Run Code Online (Sandbox Code Playgroud)

一个技巧是MySQLdb不能与Python 3.x一起使用.所以我们使用mysqlconnector,可以安装如下:

pip install mysql-connector==2.1.4  # version avoids Protobuf error
Run Code Online (Sandbox Code Playgroud)

输出:

在此输入图像描述

请注意,to_sql如果数据库中尚不存在表,则创建表和列.


Raf*_*ero 5

您可以使用 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'
Run Code Online (Sandbox Code Playgroud)

如果您已经创建了数据库

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')
Run Code Online (Sandbox Code Playgroud)

如果您尚未创建数据库,则当数据库已存在时也有效:

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')
Run Code Online (Sandbox Code Playgroud)

类似主题:

  1. 使用 SQLAlchemy、to_sql 使用 pandas 写入 MySQL 数据库
  2. 将 Pandas Dataframe 写入 MySQL

  • “name”参数应该是表名称,而不是数据库名称。 (6认同)
  • to_sql 的风格 kwarg 不再被允许。 (3认同)