python连接数据库--MySQL

pymysql

首先申明版本,python == 3.6.5,pymysql == 0.9.3,pandas == 1.1.5 。

0.安装

命令行(windows的小伙伴,快捷键 win+R键,输入cmd)

pip install pymysql

1.读取数据

import pymysql
import pandas as pd

## 数据库参数
LOCAL_MYSQL_INFO = {
    'host':"172.16.30.70",
    'user':"root",
    'password':"xxxxxx",
    'port':3306,
    'database':"demand_info"
}

def get_openapp_info():
    db = pymysql.connect(**LOCAL_MYSQL_INFO)
    sql = """
    SELECT 
    a1.openapp_id,
    a1.open_time,
    a2.user_id
    FROM `openapp_relations` a1
    LEFT JOIN open_app a2 ON a1.openapp_id = a2.id
    WHERE a1.raw_number = 1 
    """
    openapp_info = pd.read_sql(sql,db)
    db.close()
    return openapp_info

if __name__ == "__main__":
    print(get_openapp_info())

接下来大家就可以用获取到的数据在python里尽情发挥了,切片啦~ 循环啦~ 跨库合并啦~等等。

2.写入数据

import pymysql
import pandas as pd

## 数据库参数
LOCAL_MYSQL_INFO = {
    'host':"172.16.30.70",
    'user':"root",
    'password':"xxxxxx",
    'port':3306,
    'database':"demand_info"
}

## 格式1:一步到位,输入的是dataframe数据格式,注意df的列名必须与数据库的字段名一致
def insert_data(df):
    df = df.where(df.notnull(), None)  ##将dataframe数据中的null值全部替换为None,否则存储会报错

    db = pymysql.connect(**LOCAL_MYSQL_INFO)
    cursor = db.cursor()
    data = df.values.tolist()
    keys = list(df.keys())
    key = ','.join(item for item in keys)
    values = ",".join(['%s'] * len(keys))
    insert_sql = "INSERT INTO mytable({0}) VALUES({1})"
    try:
        cursor.executemany(insert_sql.format(key, values), data)
        db.commit()
        save_result = True
    except Exception as ex:
        print(ex)
        db.rollback()  ## 回滚,释放表的占用,否则一旦提交的时候报错,会锁表
        save_result = False
    finally:
        cursor.close()
        db.close()        
    return save_result


## 格式2:df的列名必须与数据库的字段名不一致
def insert_data(df):
    df = df.where(df.notnull(), None)  ##将dataframe数据中的null值全部替换为None,否则存储会报错

    db = pymysql.connect(**LOCAL_MYSQL_INFO)
    cursor = db.cursor()

    insert_sql = "INSERT INTO mytable(name, col1, col2) VALUES(%s, %s, %s)"
    try:
        cursor.executemany(insert_sql, df.values.tolist())
        db.commit()
        save_result = True
    except Exception as ex:
        print(ex)
        db.rollback()  
        save_result = False
    finally:
        cursor.close()
        db.close()        
    return save_result

注意:一定要添加回滚。如果不添加报错回滚,一旦commit提交时报错,很可能就锁表了,接下来…你就啥命令都执行不了。血泪教训。

3.更新数据

(1)update

更新特定位置的数据。举个例子,用户表中,已知用户姓名,用户更新了家庭地址和邮箱。

def update_compititor_store_data(update_data):  
    
    db = pymysql.connect(**LOCAL_MYSQL_INFO)
    cursor = db.cursor() 
    sql = """
    UPDATE user_info 
    SET address = %s,
    email = %s
    WHERE name = %s    
    """
    try:
        cursor.executemany(sql, update_data)
        db.commit()    
    except Exception as ex:
        print(ex)
        db.rollback()  
    finally:
        cursor.close()
        db.close()
(2)replace

从功能上来说:replace = update + insert

一般与唯一索引同时使用。举个例子,一张用户信息表中,如果把身份证号设为唯一索引(也就是说这张表不允许出现有同一个身份证号的两条及以上数据,表中所有用户身份证号均不同)。

那么问题来了,有个朋友刚换了一个新手机号,不记得自己注没注册过,就用新手机号注册了。这个时候,repalce会怎么做呢?首先,replace会判断你新增的数据中身份证号mysql中是否已经存在,如果存在那就删除原来的那条数据再插入新增的数据,如果不存在那就直接插入新增的数据。

语法和insert相似。

## 格式1
def replace_data(df):
    df = df.where(df.notnull(), None)
    db = pymysql.connect(**LOCAL_MYSQL_INFO)
    cursor = db.cursor()
    data = df.values.tolist()
    keys = list(df.keys())
    key = ','.join(item for item in keys)
    values = ",".join(['%s'] * len(keys))
    sql = "REPLACE INTO user_info({0}) VALUES({1})"
    try:
        cursor.executemany(sql.format(key, values), data)
        db.commit()
    except Exception as ex:
        print("出错!!",ex)
        db.rollback()
    finally:
        cursor.close()
        db.close()        

## 格式2
def replace_data(df):
    df = df.where(df.notnull(), None)
    
    db = pymysql.connect(**LOCAL_MYSQL_INFO)
    cursor = db.cursor()
    
    data = df.values.tolist()
    sql = "REPLACE INTO user_info(name, id_number, phone) VALUES(%s, %s, %s)"
    try:
        cursor.executemany(sql, data)
        db.commit()
    except Exception as ex:
        print("出错!!",ex)
        db.rollback()
    finally:
        cursor.close()
        db.close()

4.补充

其他问题,如果是postgresql数据库

建议安装psycopg2_binary

pip install psycopg2_binary

导入模块

import psycopg2

其余用法基本与pymysql一致,注意一下,postgresql没有replace语法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值