python-读写数据库
一、原理
【1】DBs——>server process——>Driver——>app
【2】app通过driver驱动处理程序的协议、请求方式等等,通过调用数据库服务的端口,处理db的数据
【3】server process:举例是mysql服务,则是mysql的进程和端口,
【4】Driver:driver驱动处理程序的协议、请求方式、管理策略等等
二、环境安装
【1】安装pymysql三方jar包:pip3 install pymysql
三、连接步骤
【1】数据库连接信息:host、user、pwd、port等
【2】创建connection数据库连接对象,表示对一个数据库的连接
【3】创建一个游标
(1)直接用select语句查询,则会将查询结果直接打印在屏幕上,不能对查询结果进行二次开发
(2)游标(Cursor)是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次一行或者多行前进或向后浏览数据的能力。可以把游标当作一个指针,它可以指定结果中的任何位置,然后允许用户对指定位置的数据进行处理
(3)通俗来说就是,操作数据和获取数据库结果都要通过游标来操作。
【4】通过游标的execute()方法来执行sql语句(如果是修改数据,需要在execute方法后加上connection.commit()方法用来提交
【5】通过游标的fetchall()方法来获取所有查询结果/通过fetchone()方法来获取单条数据
(注1:两个方法不能同时用,假设先用了fetchall方法,当时游标会在最后,再使用fetchone会造成后面打印出来的信息是None)
(注2:因为数据读取是从数据库读取到内存中,如果一下子全都fetchall,会导致内存爆满)
【6】关闭游标
【7】关闭连接对象
# 数据库连接信息
host = "*.*.*.*"
username = "root"
psw = "***"
dbname = "*"
port = 33062
# 导入第三方库
import pymysql
# 返回一个数据库连接对象,代表了对数据库的一个连接,创建连接成功
connection = pymysql.connect(host=host, user=username, password=psw, database=dbname, charset="utf8",port=port)
# 创建一个游标对象
cursor = connection.cursor()
# sql语句-查
sql1 = "select * from fq_prod_base limit 3"
# sql语句-插
sql2 = "insert into table(a,b,c) values('a','b','c')"
# 执行sql语句
cursor.execute(sql1)
cursor.execute(sql2)
# 插入的语句需要执行提交
connection.commit()
# 获取所有查询结果
#data = cursor.fetchall()
# 查询有几条记录
numrows = cursor.rowcount
#print(numrows)
# 想象有个游标,每获取一次数据,游标就会移动到后面一条记录
for x in range(numrows):
# fetchone返回的是一个元祖,里面每个元素代表一个字段
row = cursor.fetchone()
print(row)
# 关闭游标
cursor.close()
# 关闭连接
connection.close()
四、批量插入数据(可用于压测场景)
【1】文件读取
【2】获取到文件内的所有信息,按照行裁剪,返回列表
【3】执行插入语句,并提交
【4】关闭连接
# 数据库连接信息
host = "*"
username = "root"
psw = "*"
dbname = "*"
port = 33062
import pymysql
# 创建数据库连接对象
connection = pymysql.connect(host=host, user=username, password=psw, database=dbname, charset="utf8",port=port)
# 创建一个游标
cursor = connection.cursor()
# 从文件中读取数据
# open打开文件,创建一个file对象f,默认只读
with open('/Users/panshaoying/Desktop/database/data/prodbase.data',mode='r',encoding='utf8') as f:
# read()读取文件所有内容;splitlines根据行切割成一行一行,以列表形式返回
lines = f.read().splitlines()
for line in lines:
# 如果不是空行
if line:
# f-string 格式字符串以 f 开头,后面跟着字符串,字符串中的表达式用大括号 {} 包起来,它会将变量或表达式计算后的值替换进去
sql = f'insert into test(prod_code,prod_name) values({line})'
# 执行数据库语句
cursor.execute(sql)
# 提交下sql语句
connection.commit()
# 关闭数据库连接对象
connection.close()