条件准备
安装mysql
在使用pymysql的条件就是又一个mysql数据库,这个数据库可以是本地数据库也可以是远程的数据库,
mysql的安装这里就不再赘述了,各人可以参考其他的模块进行安装
安装pymysql
毗连数据库
- import pymysql
- # 连接数据库
- db = pymysql.connect(host='localhost',user='root',password='123456',port=3306)
- # 创建数据库的游标
- cursor = db.cursor()
- #execute()方法并执行 SQL 语句
- cursor.execute("select version()")
- # 读取第一条数据
- data = cursor.fetchone()
- print(data)
- # 关闭连接
- db.close()
- # 输出:
- # ('8.0.24',)
复制代码 表明:
在毗连数据的时候需要指定相应的参数
- host 数据库ip地址,如果是本地可以用localhost或127.0.0.1 如果是远程就需要指定正确的ip地址
- user 用户名
- password 暗码
- port 端口号 如果不指定就默认是3306
cursor():获取数据库的操作游标
execute() 实行SQL语句,把要进操作的内容写成SQL语句,
fetchone() 读取一条数据
close() 断开毗连,释放资源
“select version()” sql语句的实行效果
创建数据库
- import pymysql
- # 连接数据库
- db = pymysql.connect(host='localhost',user='root',password='123456')
- # 创建数据库的游标
- cursor = db.cursor()
- # 创建数据库spiders
- cursor.execute("create database spiders")
- # 关闭连接
- db.close()
复制代码
创建数据库命令实行一次就可以,背面我们在创建的数据库中进行其他的操作,如果创建的数据已经存在程序会报错"Can't create database 'spiders'; database exists"
拓展:
如果在创建数据库的不能确认数据库是否存在,但是也不想在创建数据库的时候发生报错可以使用下列语句:create database if not exists dbname
创建数据表、
表必须创建在数据库内,所以我们需要在毗连数据库以后,需要指定操作谁人数据库
- import pymysql
- # 连接数据库
- db = pymysql.connect(host='localhost',user='root',password='123456',port=3306,db='spiders')
- # 创建数据库的游标
- cursor = db.cursor()
- sql = "create table if not exists students(id varchar(255) not null,name varchar(255) not null,age int not null,primary key (id))"
- cursor.execute(sql)
- db.close()
复制代码
这次的在毗连mysql的时候connect函数新增了一个参数,db='spiders'指定我们要毗连的数据库,背面创建的表也会创建到当前数据库。
创建数据库的sql语句是 "create table if not exists students(id varchar(255) not null,name varchar(255) not null,age int not null,primary key (id))"
创建的数据库名为students,三列 id、name、age,都黑白空,主键为id
插入数据
- import pymysql
- db = pymysql.connect(user='root',password='123456',host='localhost',port=3306,db='spiders')
- cursor = db.cursor()
- id = '10005'
- name = 'zhangsan'
- age = '20'
- #方式1
- # sql = "insert into students(id,name,age) values('"+id+"','"+name+"','"+age+"')"
- # cursor.execute(sql)
- # 方式2
- # sql = "insert into students(id,name,age) values('{}','{}','{}')".format(id,name,age)
- # cursor.execute(sql)
- # 方式3(推荐)
- sql = "insert into students(id,name,age) values(%s,%s,%s)"
- cursor.execute(sql,(id,name,age))
- db.commit()
- db.close()
复制代码 通过三种sql语句的编写形式我们能够发现。方式3的最为简便,通过使用%s来进行占位,然后再通过execute()函数将数据传入sql语句中构成完整的sql语句。
在实行execute()方法之后必须要commit()方法才气将数据插入到表中,这个设计到了事务的原子性题目,事务机制可以确保数据一致性,事务有4个属性:原子性、一致性、隔离性、持久性。
属性形貌原子性事务是一个不可分割的工作单位,事务中包罗的操作要么都实行,要么都不实行一致性事务必须是数据库中一个一致性状态转变到另一个一致性状态,一致性与原子性是密切相关的隔离性一个事务不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务时隔离的,并发的各个事务之间不能相互干扰持久性持久性也称永久性,指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的,接下来的其他操作或故障不应该对其有任何影响 查询数据
在数据库操作的过程中使用最多的就是查询操作
- import pymysql
- db = pymysql.connect(user='root',password='123456',host='localhost',port=3306,db='spiders')
- try:
- sql = 'select * from students'
- cursor = db.cursor()
- cursor.execute(sql)
- d1 = cursor.fetchone()
- print("获取一条数据",d1)
- all_d = cursor.fetchall()
- print("获取所有数据",all_d)
- # sql = "insert into students(id,name,age) values('"+id+"','"+name+"','"+age+"')"
- except:
- print("Error")
- db.close()
复制代码 数据库中的数据
输出:
通过效果我们能够看到etchone()实行正常,拿出了一条数据,但是fetchall()明显是查询全部,但是效果只有除了第一条之外的数据,关于这个征象我们可以从游标的角度来表明,一开始游标在第一行实行etchone()之后游标就跑到第二行,再实行fetchall()的时候就从第二行开始查询直至末端。
可以简单的理解etchone()查询游标地点的一行数据,fetchall()查询当前游标至竣事的全部行数据。
使用where进行条件查询
查询id大于10003的数据
- import pymysql
- db = pymysql.connect(user='root',password='123456',host='localhost',port=3306,db='spiders')
- try:
- sql = 'select * from students where id>10003'
- cursor = db.cursor()
- cursor.execute(sql)
- all_d = cursor.fetchall()
- print("获取所有数据",all_d)
- # sql = "insert into students(id,name,age) values('"+id+"','"+name+"','"+age+"')"
- except:
- print("Error")
- db.close()
复制代码 输出:
更新数据
跟新数据,有时候我们再见对数据库中原来的数据进行修改
- import pymysql
- db = pymysql.connect(user='root',password='123456',host='localhost',port=3306,db='spiders')
- try:
- sql = 'update students set name=%s where id=%s'
- cursor = db.cursor()
- cursor.execute(sql,('李四','10004'))
- db.commit()
- except:
- db.rollback()
- db.close()
复制代码 删除数据
根据条件删除数据,删除id小于10004的数据
- import pymysql
- db = pymysql.connect(user='root',password='123456',host='localhost',port=3306,db='spiders')
- try:
- sql = 'delete from students where id<%s'
- cursor = db.cursor()
- cursor.execute(sql,('10004'))
- db.commit()
- except:
- db.rollback()
- db.close()
复制代码 实战应用
在现实应用时,一样寻常数据都是字典或者对象这种数据,所以需要我们在拼接SQL语句的时候更加的机动。
插入数据,若数据存在更新数据
- import pymysql
- data = {
- 'id':'10006',
- 'name':'王五',
- 'age':45
- }
- # 连接数据库
- db = pymysql.connect(user='root',password='123456',host='localhost',port=3306,db='spiders')
- table = 'students' # 表名
- keys = ','.join(data.keys()) # 拼接插入的字段
- values = ','.join(['%s']*len(data)) # 添加占位符
- # 使用with关键字,Python 解释器会自动释放资源。 它还提供错误处理
- with db:
- cursor = db.cursor()
- sql = 'insert into {}({}) values({}) on duplicate key update'.format(table, keys, values)
- update = ','.join([" {key}=%s".format(key=key) for key in data])
- sql += update
- try:
- cursor.execute(sql, tuple(data.values()) * 2)
- db.commit()
- except:
- db.rollback()
复制代码 可以发如今sql语句中有 on duplicate key update:当主键存在的时候更新数据。
我们可以根据cursor.execute()的返回值来判断数据是插入操作照旧更新操作
- 0 主键存在,且数据一样没有更新
- 1 主键不存在,插入数据
- 2 主键存在,更新操作
总结
通过pymysql我们实现了创建数据库,创建表,以及对数据的增删改查,这种基本的操作,通过这些我们也能够发现pymysql的主要作用就是毗连数据库将指令传递给mysql,具体的功能实现照旧需要我们自己编写sql语句,因此在使用pymysql的条件是能够熟练编写sql语句。
关于pymysql的一些技巧以及优化背面会有新的文章来解说
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |