900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > 读dataframe存入mysql_DataFrame数据保存到mysql数据库中

读dataframe存入mysql_DataFrame数据保存到mysql数据库中

时间:2019-08-01 03:24:56

相关推荐

读dataframe存入mysql_DataFrame数据保存到mysql数据库中

本篇文章主要基于python3.6与pandas实现以下数据库操作功能:

创建数据库

数据库创建表

数据库批量插入数据

数据库更新数据

数据库配置

class sqlConfig:

db_name = "test_db" # 数据库名

db_user = "root" # 用户名

db_host = "localhost" # IP地址

db_port = 3306 # 端口号

db_passwd = "1202" # 密码

数据库连

2种连接方式

通过MySQLdb连接

def sql_con(self):

# 打开数据库连接,此方法指定数据库

conn = MySQLdb.connect(

host=sqlConfig.db_host,

user=sqlConfig.db_user,

passwd=sqlConfig.db_passwd,

db=sqlConfig.db_name,

charset="utf8"

)

return conn

def sql_con_without_database_name(self):

# 打开数据库连接,不指定数据库。需要重新创建数据库的时候用这个

conn = MySQLdb.connect(

host=sqlConfig.db_host,

user=sqlConfig.db_user,

passwd=sqlConfig.db_passwd,

charset="utf8"

)

return conn

通过sqlalchemy模块

from sqlalchemy import create_engine

# 初始化数据库连接,使用pymysql模块

db_info = {

'user': sqlConfig.db_user,

'password': sqlConfig.db_passwd,

'host': sqlConfig.db_host,

'port': sqlConfig.db_port,

'database': sqlConfig.db_name

}

engine = create_engine(

'mysql+pymysql://%(user)s:%(password)s@%(host)s:%(port)d/%(database)s?charset=utf8' % db_info,

encoding='utf-8'

)

创建数据库

def create_database(self, database_name):

# 先创建连接

conn = self.sql_con_without_database_name()

cursor = conn.cursor()

create_database_str = 'CREATE DATABASE %s;' % database_name

cursor.execute(create_database_str)

# 断开连接

cursor.close()

conn.close()

创建表

def create_table(self, create_table_str):

# # mysql 创建表语言,表结构实例

# create_table_str = '''create table student(

# id int,

# name char(16),

# born_year year,

# birth date,

# class_time time,

# reg_time datetime

# );

# '''

# 先创建连接

conn = self.sql_con()

cursor = conn.cursor()

cursor.execute(create_table_str)

# 断开连接

cursor.close()

conn.close()

插入数据

此方法通过调用dataframe.to_sql函数实现,但是该功能是以表为单位进行数据追加或者替换整张表。不能实现替换数据中已存在部分、插入未存在的数据的功能。

def insert_data_by_pandas(self, dataframe, table_name, if_exists='append'):

'''

通过dataframe 向 sql 中插入表,此方法缺点是若表已存在,不能替换表中部分重复数据,只能替换/追加整张表

:param dataframe: pd.Dataframe类型

:param table_name: 插入的表名

:param if_exists: {'fail', 'replace', 'append'}, default 'fail'

- fail: If table exists, do nothing.

- replace: If table exists, drop it, recreate it, and insert data.

- append: If table exists, insert data. Create if does not exist.

:return:

'''

# 初始化数据库连接,使用pymysql模块

db_info = {

'user': sqlConfig.db_user,

'password': sqlConfig.db_passwd,

'host': sqlConfig.db_host,

'port': sqlConfig.db_port,

'database': sqlConfig.db_name

}

engine = create_engine(

'mysql+pymysql://%(user)s:%(password)s@%(host)s:%(port)d/%(database)s?charset=utf8' % db_info,

encoding='utf-8'

)

dataframe.to_sql(table_name, engine, if_exists=if_exists, index=False, chunksize=100)

此方法通过sql插入语句进行批量插入操作。

def insert_data_multi(self, dataframe, table_name):

'''

通过dataframe 向 sql 中批量插入数据

:param dataframe: pd.Dataframe类型

:param table_name: 插入的表名

:return:

'''

# 先创建连接

conn = self.sql_con()

cursor = conn.cursor()

# 获取列名和值

keys = dataframe.keys()

values = dataframe.values.tolist()

key_sql = ','.join(keys)

value_sql = ','.join(['%s'] * dataframe.shape[1])

# 插入语句

insert_data_str = """ insert into %s (%s) values (%s)""" % (table_name, key_sql, value_sql)

# 提交数据库操作

cursor.executemany(insert_data_str, values)

mit()

# 断开连接

cursor.close()

conn.close()

对数据进行更新

此方法在插入数据时,若数据已存在,则替换其为新数据,否则追加到数据表中。数据表中必须存在主键或者某一字段属性为“UNIQUE”。

def update_data_multi(self, dataframe, table_name):

'''

通过dataframe 向 sql 中批量插入数据

:param dataframe: pd.Dataframe类型

:param table_name: 插入的表名

:return:

'''

# 先创建连接

conn = self.sql_con()

cursor = conn.cursor()

# 获取列名和值

keys = dataframe.keys()

values = dataframe.values.tolist()

key_sql = ','.join(keys)

value_sql = ','.join(['%s'] * dataframe.shape[1])

# 插入语句,若数据已存在则更新数据

insert_data_str = """ insert into %s (%s) values (%s) ON DUPLICATE KEY UPDATE""" % (table_name, key_sql, value_sql)

update_str = ','.join([" {key} = VALUES({key})".format(key=key) for key in keys])

insert_data_str += update_str

# 提交数据库操作

cursor.executemany(insert_data_str, values)

mit()

# 断开连接

cursor.close()

conn.close()

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。