pymysql用法、将DataFrame数据直接写入MySQL数据库

python 用 pymysql 新建数据库、表,通过 pandas 查看结果 https://www.cnblogs.com/shanger/p/12982110.html 

从config读取配置 https://jingyan.baidu.com/article/425e69e67b9407fe14fc164f.html

目录

1、python3 + pymysql 创建数据库

2、使用pandas将DataFrame数据直接写入MySQL数据库


1、python3 + pymysql 创建数据库

import pymysql

# 创建连接
conn = pymysql.connect(host='localhost',user='root',password='123456',charset='utf8mb4')
# 创建游标
cursor = conn.cursor()
 
# 创建数据库的sql(如果数据库存在就不创建,防止异常)
sql = "CREATE DATABASE IF NOT EXISTS db_name" 
# 执行创建数据库的sql
cursor.execute(sql)

创建表 

sql_2 = '''CREATE TABLE `employee` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `topic` INT ,
  `ptid` INT NOT NULL,
  `level` INT NOT NULL,
  `time` TIME,
  `consume` INT NOT NULL,
  `err` INT NOT NULL,
  `points` INT NOT NULL,
  `gid` INT NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
'''
cursor.execute(sql_2)


SQL = """CREATE TABLE `income` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `datetime` varchar(20) DEFAULT NULL,
  `ironincome` decimal(20,2) DEFAULT NULL,
  `generalincome` decimal(20,2) DEFAULT NULL,
  `baiincome` decimal(20,2) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
"""
cursor.execute(SQL)
#执行插入语句
sql = "insert into jnl(jnl_name,jnl_date,jnl_time) values('%s','%s','%s')"%('mmk','2018-07-26','2018-07-26 11:12:30')
try:
    cur.execute(sql)
    conn.commit()#提交
except:
    print('执行插入失败')
    conn.rollback()#回滚

#执行查询语句
sql = 'select * from jnl'
try:
    cur.execute(sql)
    print(cur.fetchone())
except:
    print('查询失败')

#执行更新语句
sql = "update jnl set jnl_name='%s' where jnl_name='%s'"% ('Hello','mmk')
try:
    cur.execute(sql)
    conn.commit()#提交
except Exception as e:
    print('执行更新失败',e)
    conn.rollback()#回滚
#执行查询语句
sql = 'select * from jnl'
try:
    cur.execute(sql)
    print(cur.fetchone())
except:
    print('查询失败')

#执行删除语句
sql='delete from jnl'
try:
    cur.execute(sql)
    conn.commit()
except Exception as e :
    print('删除失败')
    conn.rollback()

#执行查询语句
sql = 'select * from jnl'
try:
    cur.execute(sql)
    print(cur.fetchone())
except:
    print('查询失败')
#关闭连接
conn.close()

2、使用pandas将DataFrame数据直接写入MySQL数据库

import pandas as pd
from sqlalchemy import create_engine
from sqlalchemy.types import NVARCHAR, Float, Integer

def pd2sql():
    """
    to_sql目前只支持两类mysql引擎一个是sqlalchemy和sqlliet3
    :return:
    """
    # 初始化数据库连接,使用pymysql模块
    # MySQL的用户:root, 密码:147369, 端口:3306,数据库:mydb
    # ?charset=utf8 指定数据库编码
    engine = create_engine('mysql+pymysql://root:147369@localhost:3306/mydb?charset=utf8')
    conn = engine.connect()
    for i in range(1, 10):
        # 指定字段的数据类型
        dtypedict = {
            'index_code': NVARCHAR(length=255),
            'date': NVARCHAR(length=255),
            'open': NVARCHAR(length=255),
            'close': NVARCHAR(length=255),
            'low': NVARCHAR(length=255),
            'high': NVARCHAR(length=255),
            'volume': NVARCHAR(length=255),
            'money': NVARCHAR(length=255),
            'change': NVARCHAR(length=255)
        }

        csv_path = r'E:\data\yucezhe\trading-data-push.20190201\2019-02-01 index data.csv'

        # 读取本地CSV文件
        df = pd.read_csv(csv_path).head()

        # 将DataFrame储存为MySQL中的数据表,不储存index列
        df.to_sql(f'csv_table{i}', engine, if_exists='replace', index=False, dtype=dtypedict)

        # 执行原生sql语句
        # 设置主键
        conn.execute(f"alter table csv_table{i} add constraint p_key primary key (index_code)")

        # 从表设置外键
        if i%2 == 0:
            conn.execute(
                f"alter table csv_table{i-1} add  foreign key (index_code) references csv_table{i}(index_code)")

        print(f"Write to MySQL successfully! ---- csv_table{i}")
    engine.dispose()


pd2sql()

# 对已存在的表做主键:alter table csv_short1 add constraint p_key primary key (index_code);

# 对已存在的表做外键:alter table csv_short1 add  foreign key (index_code) references csv_short2(index_code);

# 内连接查询:select * from a,b where a.x = b.x

create_engine用法  

engine = create_engine('dialect+driver://username:password@host:port/database')
dialect -- 数据库类型
driver -- 数据库驱动选择
username -- 数据库用户名
password -- 用户密码
host 服务器地址
port 端口
database 数据库

pandas.to_sql函数用法:

主要有以下几个参数:

name: 输出的表名
con: 与read_sql中相同,数据库链接
if_exits: 三个模式:fail,若表存在,则不输出;replace:若表存在,覆盖原来表里的数据;append:若表存在,将数据写到原表的后面。默认为fail
index:是否将df的index单独写到一列中
index_label:指定列作为df的index输出,此时index为True
chunksize: 同read_sql
dtype: 指定列的输出到数据库中的数据类型。字典形式储存:{column_name: sql_dtype}。常见的数据类型有sqlalchemy.types.INTEGER(), sqlalchemy.types.NVARCHAR(),sqlalchemy.Datetime()等,具体数据类型可以参考这里

注:如果不提供dtype,to_sql会自动根据df列的dtype选择默认的数据类型输出,比如字符型会以sqlalchemy.types.TEXT类型输出,相比NVARCHAR,TEXT类型的数据所占的空间更大,所以一般会指定输出为NVARCHAR;而如果df的列的类型为np.int64时,将会导致无法识别并转换成INTEGER型,需要事先转换成int类型(用map,apply函数可以方便的转换)。

 

你可能感兴趣的:(MySql)