美文网首页数据库Python
pymysql操作mysql数据库

pymysql操作mysql数据库

作者: 九章9405 | 来源:发表于2020-11-21 15:20 被阅读0次

pandas中read_sql用起来比较方便,但我目前没有找到更新、删除、插入的方法,因此我用pymysql做了补充。

#导入pymysql和pandas
import pymysql
import pandas as pd
  • 见表语句
CREATE TABLE
IF
    NOT EXISTS bi_operate_kpi_stat_v1 (
        id INT( 11 ) AUTO_INCREMENT NOT NULL COMMENT '自增id',
        thedate VARCHAR (50) NOT NULL COMMENT '统计日期(T+1)',
        stat_kind INT ( 2 ) NOT NULL COMMENT '统计类型,1:按日统计,2:按周统计,3按月统计',
        user_kind INT ( 2 ) NOT NULL COMMENT '用户类型,1新用户,2老用户',
        cid INT ( 11 ) NOT NULL COMMENT '城市id,0表示全部城市',
        uv INT ( 11 ) NOT NULL COMMENT '活跃用户数',
        pv INT ( 11 ) NOT NULL COMMENT '用户页面跳转次数',
        page_num INT ( 11 ) NOT NULL COMMENT '用户访问页面数',
        local_uv INT ( 11 ) NOT NULL COMMENT '本地用户数',
        tools_uv INT ( 11 ) NOT NULL COMMENT '工具用户数',
        hunpin_uv INT ( 11 ) NOT NULL COMMENT '婚品用户数',
        community_uv INT ( 11 ) NOT NULL COMMENT '社区用户数',
        connect_uv INT ( 11 ) NOT NULL COMMENT '本地建联用户数',
        connect_umv INT ( 11 ) NOT NULL COMMENT '本地建联数',
        connect_umv2 INT ( 11 ) NOT NULL COMMENT '婚策建联数',
        connect_umv6 INT ( 11 ) NOT NULL COMMENT '婚摄建联数',
        connect_umv12 INT ( 11 ) NOT NULL COMMENT '礼服建联数',
        connect_umv13 INT ( 11 ) NOT NULL COMMENT '酒店建联数',
        hunpin_paid_uv INT ( 11 ) NOT NULL COMMENT '婚品支付用户数',
        hunpin_paid_num INT ( 11 ) NOT NULL COMMENT '婚品支付订单数',
        hunpin_paid_gmv INT ( 11 ) NOT NULL COMMENT '婚品支付订单金额',
        card_gift_money INT ( 11 ) NOT NULL COMMENT '礼物礼金金额',
        add_values_money INT ( 11 ) NOT NULL COMMENT '增值服务收入:请帖、MV、会员收益',
        create_time datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
        update_time datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    PRIMARY KEY (`id`),
  UNIQUE KEY `date_kind_city` (`thedate`,`stat_kind`,`user_kind`,`cid`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8mb4 COMMENT='运营核心指标';
#连接数据库
conn = pymysql.connect(host='服务地址', port=3306,database='默认库',user='用户名',password='密码',charset='utf8')
#定义函数
#定义函数
def inser_to_table(table,df,conn):
    """将df数据插入到数据库(如果存在,则更新数据)"""
    with conn.cursor() as cursor:
            try:
                col = '('+','.join(df.columns)+')'
                par = '('+','.join(['%s' for i in df.columns])+')'
                keys = ','.join([f'{i} = values({i})' for i in df.columns])
                sql = r"""insert into {0}{1} values{2} on duplicate key update {3};""".format(table,col,par,keys)
                cursor.executemany(sql,[tuple(i) for i in df.values])
                conn.commit()
                print("数据插入成功!")
            except:
                print("数据插入失败,开始回滚!")
                conn.rollback()
                print("数据回滚成功!")
              
def query_sql(sql,conn):
    """删除、更新操或者插入几条数据用这个"""
    with conn.cursor() as cursor:
        try:
            cursor.execute(sql)
            conn.commit()
            print("执行成功!")
        except:
            conn.rollback()
            print("数据回滚成功!")
            
def query_data_sql(sql,conn):
    """查询数据,返回为DataFrame类型"""
    with conn.cursor() as cursor:
        try:
            cursor.execute(sql)
            result = cursor.fetchall()
            cols = cursor.description
            print("数据查询成功,共{0}条数据".format(len(result)))
            return pd.DataFrame(result,columns = [i[0] for i in cols])
        except:
            print("数据查询失败!")

query_data_sql(sql,conn) 和 pd.read_sql(sql,conn)效果一样

#调用以上函数
df = query_data_sql(sql,conn) 
#调用pandas的方法
df = pd.read_sql(sql,conn)

需要注意的是,使用inser_to_table(table,df,conn)方法,最好是先把格式转为str类型,不然容易报格式错误。

相关文章

网友评论

    本文标题:pymysql操作mysql数据库

    本文链接:https://www.haomeiwen.com/subject/xtceiktx.html