Python 运用pymysql+pandas 完成连接 MySQL 数据库读

pymysql库连接

pandas读

# pymysql 是在 python3.x 版本中用于连接 MySql 服务器的一个库
# 1.创建一个连接对象
# host mysql 服务器地址
# port 数字类型 端口
# user 用户名
# passwd 密码
# db 数据库名称
# charset 连接编码,需要显示指明编码方式

# 2.获取游标
# 游标是什么?
# 简述:游标(cursor)是一个游动的标识,可以理解成一条sql取出对应n条结果资源的接口/句柄,就是游标,沿着游标可以一次取出一行

# 3.执行增删改查的操作
# 4.处理数据
# 5.关闭cursor
# 6.关闭connection
import pymysql
import pandas as pd
# 创建一个连接对象,打开数据库连接
conn=pymysql.connect(host='localhost',port=3306,user='root',passwd='密码',db='数据库名',charset='utf8')
# 获取游标
cursor=conn.cursor()
# 创建一个字符串语句,字符串支持换行
sql = """
    select * from football.player
"""
cursor.execute(sql)
data1=cursor.fetchall()
df1=pd.DataFrame(list(data1),columns=['id','name','club_id','country_id','position_id','history_club_id','active'])

print(df1)

cursor.close()
conn.close()

2.其他方法

方法描述
begin() 开启事务
commit() 提交事务
cursor(cursor=None) 创建一个游标用来执行语句
ping(reconnect=True) 检查连接是否存活,会重新发起连接
rollback() 回滚事务
close() 关闭连接
select_db(db) 选择数据库
show_warnings() 查看warning信息

3.获取cursor对象

   1.游标对象,用于执行查询和获取结果

   2.核心方法

方法名说明
execute() 用于执行一个数据库的查询命令
fetchone() 获取结果集中的下一行
fetchmany(size) 获取结果集中的下(size)行
fetchall() 获取结果集中剩下的所有行
rowcount 最近一次execute返回数据/影响的行数
close() 关闭游标

 

4.举个栗子

# 执行查询功能
with connection.cursor() as cursor:
    sql = 'select * from home_user'
    cursor.execute(sql)
    results = cursor.fetchall()
    connection.commit()
    for results in results:
        uid = results[0]
        name = results[1]
        password = results[2]
        print('==========用户信息===============')
        print('用户id: {id} 
用户名: {name}
密码: {pwd}'.format(id=uid, name=name, pwd=password))

5.详细

方法描述
close() 关闭游标。
execute(query, args=None) 执行单条语句,传入需要执行的语句,是string类型;同时可以给查询传入参数,参数可以是tuple、list或dict。执行完成后,会返回执行语句的影响行数,如果有的话。
executemany(query, args) 执行多条INSERT语句,传入需要执行的语句;同时可以给查询传入参数,参数是一个mappings序列。执行完成后,会返回执行语句的影响行数,如果有的话。
fetchone() 获取下一行数据。
fetchall() 获取所有数据。
fetchmany(size=None) 获取几行数据。
read_next() 获取下一行数据。
callproc() 用来调用存储过程。
mogrify() 参数化查询,防止SQL注入。
scroll(num,mode) 移动游标位置。

6.基本操作

查询数据

# 1.分页查询操作
def find_by_page(page, size):
    with pymysql.connect(host=HOST,
                         port=PORT,
                         user=USER,
                         passwd=PASSWORD,
                         charset=CHARSET,
                         db=DB_NAME) as cursor:
        sql = "SELECT * FROM t_addr LIMIT{},{}".format((page - 1) * size, size)
        cursor.execute(sql)
        user = cursor.fetchall()

事务操作

conn = pymysql.connect(
    host='10.10.0.109',
    port=3306,
    user='mha',
    password='123456',
    database='sbtest',
    charset='utf8'
)

cursor = conn.cursor()

# 插入sql;
sql_insert = "insert into t_user (userid,username) values (10,'user10')"
# 更新sql;
sql_update = "update t_user set username = 'name91' where userid=9"
# 删除sql;
sql_delete = "delete from t_user where userid < 3"

# 把一个事务放到一个try块里,如果出现异常就回滚;
try:
    # 开启事务;
    conn.begin()

    cursor.execute(sql_insert)
    print(cursor.rowcount)

    cursor.execute(sql_update)
    print(cursor.rowcount)

    cursor.execute(sql_delete)
    print(cursor.rowcount)

    # 提交事务;
    conn.commit()

except Exception as e:
    # 若有异常就回滚;
    conn.rollback()

cursor.close()
conn.close()

批量插入

# 测试事务 批量添加
def test_batch_insert():
    conn = pymysql.connect(host=HOST,
                           port=PORT,
                           user=USER,
                           passwd=PASSWORD,
                           charset=CHARSET,
                           db=DB_NAME)
    cursor = conn.cursor()
    try:
        sql = 'INSERT INTO t_addr(PROVICE, CITY, COUNTY, DEATIL, USERID) VALUES (%s,%s,%s,%s,%s)'
        li = []
        for i in range(50):
            li.append(('湖北省', '武汉市', '高新区' + str(i), '智慧园2135', 6))
        # 开启事物
        conn.begin()
        cursor.executemany(sql, li)
        # 提交
        conn.commit()
    except Exception as e:
        conn.rollback()
        print(e)
        # 报错事务回滚
    finally:
        # 关闭连接
        cursor.close()
        conn.close()

通过跳板机SSH连接连接MySQL

import pymysql
import pandas as pd
from sshtunnel import SSHTunnelForwarder

with SSHTunnelForwarder(
    # 配置SSH连接
    ssh_address_or_host=('跳板机对应的地址',int('端口号')),    # 指定SSH登陆的条件及的address
    ssh_password='跳转机密码',   # 跳转机的密码
    ssh_username='跳转机用户名',  # 跳转机的用户名
    local_bind_address=('127.0.0.1',int('2222')),   # 映射到本机的地址和端口,此处必须是127.0.0.1
    remote_bind_address=('mysql服务器地址',int('端口号'))) as server:   # MySQL服务器的配置,有数据的服务器
  conn=pymysql.connect(host='localhost',port=3306,user='root',passwd='密码',db='数据库名',charset='utf8')
  cursor=conn.cursor()  # 获取游标

 

原文地址:https://www.cnblogs.com/hsinfo/p/13664387.html