零基础 学 python开发 (Genius套餐A) 三十九

夜光序言:

 

 

 

你需要的话,可以拿走我的面包,可以拿走我的空气,可是别把你的微笑拿掉。

 

 

 

 

正文:

 

7.3 MySQL 命令参数
 
7.3.1 目标 


数据库操作的基本命令是 SQL 命令,而 SQL 命令一般是一个字符串,但是有些情况下由于数据的特殊性,并不能组织一条完整的 SQL 命令,这就要求使用带参数的 SQL 命令,

目标是掌握带参数的 SQL 命令的使用方法,把特殊的二进制数据(例如学生照片)、长文本数据(例如学生简历)等存储到数据库中。


 

7.3.2 数据库参数 
在使用 execute 执行 SQL 命令时会碰到两个问题:


(1) 如果数据复杂,组合的 SQL 命令可能会无效,例如 students 表中如果要插入一个学生的姓名是 R"J,那么:
sql="insert into students (pNo,pName) values ('1', 'R"J')"
这样的 sql 命令时无效的,怎么样插入这样的记录就成了问题、


(2) 如果数据表包含一些复杂的字段,例如学生表还有学生照片 sImage 字段以及备注指端 pNote,即:

create table studentExts
(
 pNo varchar(16) primary key,
 pName varchar(16),
 pGender varchar(8) ,
 pAge int,
 pImage blob,
 pNote text
)


那么要把二进制数据存储到 pImage 中,通过前面介绍的文本组合的 SQL 命令时不行的,同时 pNote 字段可能存储很多稀奇古怪的字符。

这些问题的提出使得我们不得不采用带参数的 execute 命令,这种命令基本形式是:
cursor.execute(带参数的 SQL 命令,(参数列表)) 

其中带参数的 SQL 命令是 SQL 命令中把不确定的值用参数表示,MySQL 数据库参数统一用"%s"表示,参数列表是对应参数的具体值,它们放在一个元组或者列表中,例如:

cursor.execute("insert into students (pNo,pName) values (%s,%s)",('1','R"J'))

在执行时 pNo,pName 的值时参数%s,%s 表示的,具体的值由后面的('1','R"J')提供,因此 pNo='1', pName='R"J'。

 


7.3.3 【案例】学生数据表的管理 


1、案例描述 
使用数据库 SQL 命令参数的方法管理学生数据表。
2、案例分析 
有了参数的 SQL 命令,就可以处理各种各样的数据了,设计一个 MembersDB 的类来实现
学生表的各种数据操作,例如插入一条记录:
sql="insert into members (pNo,pName,pGender,pAge) values (%s,%s,%s,%s)"
self.cursor.execute(sql,(pNo,pName,pGender,pAge))
其中 sql 中有 4 个%s 参数,对应的在 execute 命令中提供这 4 个参数的具体值。
 



3、案例代码 

# 夜光

import pymysql

class MembersDB:
 def open(self):
  self.con = pymysql.connect(host="127.0.0.1", port=3306, user="root",passwd="1111", db="agvtest1", charset="utf8")
  self.cursor = self.con.cursor(pymysql.cursors.DictCursor)
  try:
   sql="create table members (pNo varchar(16) primary key,pName varchar(16),pGender varchar(8) ,pAge int)"
   self.cursor.execute(sql)
  except:
   pass
 def close(self):
  self.con.commit()
  self.con.close()
 def clear(self):
  try:
   self.cursor.execute("delete from members")
  except Exception as err:
   print(err)
 def show(self):
  self.cursor.execute("select pNo,pName,pGender,pAge from members")
  print("%-16s%-16s%-8s%-4s" % ("No","Name","Gender","Age"))
  rows=self.cursor.fetchall()
  for row in rows:
   print("%-16s%-16s%-8s%-4d" %(row["pNo"],row["pName"],row["pGender"],row["pAge"]))
 def insert(self,pNo,pName,pGender,pAge):
  try:
   sql="insert into members (pNo,pName,pGender,pAge) values(%s,%s,%s,%s)"
   self.cursor.execute(sql,(pNo,pName,pGender,pAge))
   print(self.cursor.rowcount," row inserted")
  except Exception as err:
   print(err)
 def update(self,pNo,pName,pGender,pAge):
  try:
   sql="update members set pName=%s,pGender=%s,pAge=%s where pNo=%s"
   self.cursor.execute(sql,(pName,pGender,pAge,pNo))
   print(self.cursor.rowcount," row updated")
  except Exception as err:
   print(err)
 def delete(self, pNo):
  try:
   sql = "delete from members where pNo=%s"
   self.cursor.execute(sql, (pNo,))
   print(self.cursor.rowcount, " row deleted")
  except Exception as err:
   print(err)



db=MembersDB()



db.open()
db.clear()
db.insert("5","F","女",11)
db.show()
db.update("5","A","女",12)
db.show()
db.insert("2","T","女",13)
db.show()
db.delete("2")
db.show()
db.close()

 



结果:
 

程序中设计 open 与 close 来打开与关闭数据库,clear()清空数据库表 members 的数据,insert、update、delete 分别实现数据的插入、更新、删除,而 show 时显示学生记录。值得注意的是 delete 函数中的语句:
 self.cursor.execute(sql, (pNo,))
其中(pNo,)表示只有一个元素的元组,不能写成:
 self.cursor.execute(sql, (pNo))
这个(pNo)等效于 pNo,是一个单值不是元组。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值