Python实现MySQL数据库连接---pymysql

Posted 两个月亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python实现MySQL数据库连接---pymysql相关的知识,希望对你有一定的参考价值。

Python实现mysql数据库连接---pymysql

导入模块

import json
import pymysql
import time
import traceback

读取JSON文件,并将其转换为Python数据格式–字典

fo = open('./DouBanTOP250_info_primary.txt', 'r')
info = json.load(fo)
fo.close()

连接数据库管理系统

conn = pymysql.connect(
    user = 'YourUserName',
    password = 'YourPassword',
    # MySQL的默认端口为3306
    port = 3306,
    # 本机地址为127.0.0.1或localhost
    host = '127.0.0.1',
    # 指定使用的数据库
    init_command = 'use DouBanTOP250_info'
)
# 创建游标对象
cur = conn.cursor()

init_command是在数据库连接成功后执行的SQL语句,
其中

use DouBanTOP250_info

的含义是使用数据库DouBanTOP250_info,故可以使用pymysql.connect()的database参数代替
即:

conn = pymysql.connect(
    user = 'YourUserName',
    password = 'YourPassword',
    # MySQL的默认端口为3306
    port = 3306,
    # 本机地址为127.0.0.1或localhost
    host = '127.0.0.1',
    # 指定使用的数据库
    database = 'DouBanTOP250_info'
)
# 创建游标对象
cur = conn.cursor()

上述的两种写法是等效的。

初始化操作(在指定的表不存在时,创建一张表)

# 创建表的SQL语句
SQL = 'create table if not exists info('\\
      'id int primary key,' \\
      'title char not null,' \\
      'photo_src char not null)'
try:
    # 开启一个事务
    conn.begin()
    # 设置将执行的SQL语句
    cur.execute(SQL)
    # 提交事务
    conn.commit()
except Exception:
    print('【初始化失败(表)】')
    # 打印错误信息
    print('    ', traceback.print_exc())
    pass

traceback.print_exc(file=fo)

其中fo是一个文件对象,可以使用open()函数创建
可将错误信息输出到指定的文件(fo)中。

将数据插入到目标数据库的指定表中

start = time.time()
# 将数据插入到目标数据库的指定表中
try:
    # 开启一个事务
    conn.begin()
    for item in info.values():
        cur.execute('insert into info (title, photo_src) values(%s, %s)', [item['title'], item['photo_src']])
    # 提交事务
    conn.commit()
    # 记录处理时间
    process_time = time.time() - start
    # 打印处理时间
    print(process_time)
except Exception:
    print('【插入数据失败】')
    # 打印错误信息
    print(traceback.print_exc())
    pass
# 关闭游标
cur.close()
# 关闭连接
conn.close()

cur.execute(‘insert into info (title, photo_src) values(%s, %s)’, [item[‘title’], item[‘photo_src’]])

不要直接拼接字符串来构造需要执行的SQL语句,推荐使用参数完成构造,理由有二:

  1. 参数SQL会被系统缓存,当多次执行同一语句时,无需对SQL进行反复编译。
  2. 可防止SQL注入。

注:
短时间有大量不同的SQL语句需要循环执行时,在条件允许的情况下,应在循环结束后提交事务。
若使用下述代码(每循环一次提交一次事务):

start = time.time()
# 将数据插入到目标数据库的指定表中
try:
    # 开启一个事务
    conn.begin()
    for item in info.values():
        cur.execute('insert into info (title, photo_src) values(%s, %s)', [item['title'], item['photo_src']])
    	# 提交事务   <-------------------------改动一处
    	conn.commit() 
    # 记录处理时间
    process_time = time.time() - start
    # 打印处理时间
    print(process_time)
except Exception:
    print('【插入数据失败】')
    # 打印错误信息
    print(traceback.print_exc())
    pass
# 关闭游标
cur.close()
# 关闭连接
conn.close()

花费时间将由原来的1.5s(平均)上升到7.5s(平均),性能方面将出现很大的损失。

代码总汇

# 导入模块
import json
import pymysql
import time
import traceback


# 读取JSON文件,并将其转换为Python数据格式--字典
fo = open('./DouBanTOP250_info_primary.txt', 'r')
info = json.load(fo)
fo.close()


# 连接数据库管理系统
conn = pymysql.connect(
    user = 'YourUserName',
    password = 'YourPassword',
    # MySQL的默认端口为3306
    port = 3306,
    # 本机地址为127.0.0.1或localhost
    host = '127.0.0.1',
    # 指定使用的数据库
    init_command = 'use DouBanTOP250_info'
    # 上述语句可使用
    # database = DouBanTOP250_info
    # 进行替换
)
# 创建游标对象
cur = conn.cursor()


# 初始化操作(在指定的表不存在时,创建一张表)
# 创建表的SQL语句
SQL = 'create table if not exists info('\\
      'id int primary key,' \\
      'title char not null,' \\
      'photo_src char not null)'
try:
    # 开启一个事务
    conn.begin()
    # 设置将执行的SQL语句
    cur.execute(SQL)
    # 提交事务
    conn.commit()
except Exception:
    print('【初始化失败(表)】')
    # 打印错误信息
    print('    ', traceback.print_exc())
    # traceback.print_exc(file=fo)
    # (其中fo是一个文件对象,可以使用open()函数创建)
    # 可将错误信息输出到指定的文件(fo)中。
    pass


# 布置计时器
start = time.time()
# 将数据插入到目标数据库的指定表中
try:
    # 开启一个事务
    conn.begin()
    for item in info.values():
        # 不要直接拼接字符串来构造需要执行的SQL语句,推荐使用参数完成构造,理由有二:
        # (cur.execute(SQL, args)
        # 1. 参数SQL会被系统缓存,当多次执行同一语句时,无需对SQL进行反复编译。
        # 2. 可防止SQL注入
        cur.execute('insert into info (title, photo_src) values(%s, %s)', [item['title'], item['photo_src']])
    # 提交事务
    conn.commit()
    # 记录处理时间
    process_time = time.time() - start
    # 打印处理时间
    print(process_time)
except Exception:
    print('【插入数据失败】')
    # 打印错误信息
    print(traceback.print_exc())
    pass
# 关闭游标
cur.close()
# 关闭连接
conn.close()

Python学习第五篇:操作MySQL数据库

Python学习第五篇:操作MySQL数据库

活动地址:CSDN21天学习挑战赛

python 操作MySQL数据库,要先安装第三方库pymysql

命令行 pip install pymysql

pycharm 里的setting 设置里添加库

——

操作数据库基本流程

  • 与数据库创建连接
  • 获取游标
  • 通过游标执行sql语句
  • 关闭游标
  • 关闭数据库连接

创建连接对象

conn = pymysql.connect(host='localhost',port=3306,user='root',password='root',database='stu')

pymysql.connect() 的可用参数:
host:mysql 的地址,本地为 localhost 或127.0.0.1
port:连接mysql 的端口,默认3306
database:数据库名称
user:连接用户名
password:连接的密码
charset: 通信采用的编码方式,推荐使用utf8
——

获取游标对象

要执行数据库的增删改查语句需要通过游标对象

cur = conn.cursor()

cursor() 的参数说明:
execute( operation [parameters]):使用游标执行SQL语句,返回受影响的行数,主要用于执行insert、update、delete、select等语句,也可以执行create、alter、drop等语句
cur.fetchone(): 获取查询结果集中的一条数据,返回一个元组,如(1,张三)
cur.fetchall(): 获取查询结果集中的所有数据,返回一个元组,如((1,张三),(2,'李四"))
cur.close(): 关闭游标,表示和数据库操作完成

——

操作数据库测试:

import pymysql

conn = pymysql.connect(host='localhost',port=3306,user='root',password='root',database='stu')
cursor = conn.cursor()
cursor.execute("select * from student;")
row = cursor.fetchone()
print(row)
cursor.close()
conn.close()

得到sql 语句 "select * from student;" 的执行结果为 ('201215121', '李勇', '男', 18, '计算机系')
即查 student 表中的所有数据。
这里是用了 cur.fetchone() , 只能获取查询结果集中的一条数据

要获取多条数据, 用fetchall(),获取查询结果集中的所有数据

import pymysql

conn = pymysql.connect(host='localhost',port=3306,user='root',password='root',database='stu')
cursor = conn.cursor()
cursor.execute("select * from student;")
row = cursor.fetchall()
print(row)
cursor.close()
conn.close()

得到查询结果:(('201215121', '李勇', '男', 18, '计算机系'), ('201215122', '刘晨', '女', 19, '计算机系'))
是一个元组,元组里有两个元组

——
所以用python存在数据库,根据这个模板即可,只需在 execute() 中填写想要执行的sql语句,对数据库进行增删改查等操作。

import pymysql

conn = pymysql.connect(host='localhost',port=3306,user='root',password='root',database='stu')
cursor = conn.cursor()
cursor.execute("sql语句")
row = cursor.fetchall()
print(row)
cursor.close()
conn.close()

以上是关于Python实现MySQL数据库连接---pymysql的主要内容,如果未能解决你的问题,请参考以下文章

python连接数据库

第三篇 Python关于mysql的API--pymysql模块

pymysql 基操全套

Python 3.6连接到MySQL

如何使用pymysql连接MySQL数据库

Python向mysql数据库插入数据