目录
先讲错误,再说执行带参数的sql语句的使用和时间相加减
错误一:
sqlite3.OperationalError: near "[0]": syntax error
原因:这个错误通常发生在SQL语句中出现了不支持的特殊字符,如方括号 [ ]。 在SQLite中,方括号并不是合法的标识符字符,因此如果需要在SQL语句中(注意:参数中可以使用)使用元组或者列表等带有[ ]时,就会报错
解决办法:可以使用问号 ? 代替方括号,或者直接使用变量名字。
错误二:
sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 1, and there are 2 supplied.
原因:该错误提示提供的绑定参数的数量不正确,与SQL语句中需要绑定的参数数量不一致。通常这是由于绑定参数没有被正确地传递给execute()函数所引起的,但是!!!,特别强调,只用一个参数时,一定要在参数后面多家一个冒号,不然也要报错,我就因为这样浪费很多时间。
这样就是错误的:
错误三:
sqlite3.OperationalError: misuse of aggregate
原因:这个错误通常是因为SQL中的聚合函数(如COUNT()
函数)和其他非聚合函数混在一起使用而引起的,这是一个简单但是容易犯的错误,这是当时的错误代码:
row = cur.execute("select count(*) as count1 from Bookstate where
username=? and count1>2", (username,)).fetchone()
在 SQL 中,COUNT(*)
是一个聚合函数,其返回值是一个整数,表示查询结果集中的行数。因此,在查询语句中使用别名 count1
并在 WHERE
子句中比较 count1
的值是无效的。
解决办法:
# 查询借阅数量
cur.execute("SELECT COUNT(*) AS borrow_count FROM Bookstate WHERE username = ?", (username,))
row = cur.fetchone()
borrow_count = row[0]
# 此时就可以使用borrow_coun判断借阅数量是否大于2
错误四 :
TypeError: unsupported operand type(s) for -: 'datetime.datetime' and 'str'
原因: 这个错误通常是一个字符串类型的时间与 datetime
类型的时间进行减法运算,两者的类型不兼容。在进行时间运算时,需要确保两个时间对象的类型相同。
解决办法:可以将字符串类型的时间转换为 datetime
类型的时间,当然也可以反过来,但建议前者,因为这样可以直接进行时间相减,方便快捷。
字符串转换为时间以及时间的加减运算
将字符串类型的时间转换为
datetime
类型的时间,可以使用datetime.strptime()
方法获取今天时间使用datetime.today(),举一个时间相减的列子,相加的一样
from datetime import datetime #需要datetime模块 str = "2023-6-7" time = datetime.strptime(str, '%Y-%m-%d') #%Y 表示年份,%m 表示月份,%d 表示日期 #yyyy-mm-dd格式 #比如和今天时间相减 today = datetime.today() #获取今天时间 tiem_dif = today-time #时间差
带参数的SQL语句:
python 中有两种占位符,一种是使用问号占位(?),另一种是使用命名变量,还有python中格式化字符串也可以执行带参数的SQL语句
问号占位符:
import sqlite3
dbstr = "D:\学习\科目学习\专业综合训练2\PCT.db" #里面放数据库文件地址
conn = sqlite3.connect(dbstr)
cur = conn.cursor()
#更新操作
num=input()
sqlstr = "update Book set number=?,name=?,author=?,press=?,pubdate=?,price=? where
number=?"
record = (1, 'Python编程从入门到精通', '张三', '机械工业出版社', '2021-01-01', 59.9)
cur.execute(sqlstr, (record[0], record[1], record[2], record[3], record[4], record[5],num))
#插入操作
sqlstr = "insert into Book (number,name,author,press,pubdate,price)" \
"values(?,?,?,?,?,?)"
cur.execute(sqlstr, (records[0], records[1], records[2], records[3], records[4],
records[5]))
conn.commit()
cur.close()
命名变量占位符:
import sqlite3
dbstr = "D:\学习\科目学习\专业综合训练2\PCT.db" #里面放数据库文件地址
conn = sqlite3.connect(dbstr)
cur = conn.cursor()
#删除操作
num = input("请输入编号:")
cur.execute("delete from Book where number=:num", {"num": num})
cur.execute("delete from Bookstate where number=:num", {"num": num})
conn.commit()
cur.close()
格式化字符串 :
import sqlite3
dbstr = "D:\学习\科目学习\专业综合训练2\PCT.db" #里面放数据库文件地址
conn = sqlite3.connect(dbstr)
cur = conn.cursor()
#插入操作
cur.execute(f"insert into Bookstate(id,number) values(1,{records[0]})")
cur.execute(f"insert into Bookstate(id,number) values(2,{records[0]})")
cur.execute(f"insert into Bookstate(id,number) values(3,{records[0]})")
conn.commit()
cur.close()