图书管理系统设计——执行带参数的sql语句占位符使用、怎样进行时间相加减、以及错误记录(python,sqlite)

目录

错误一:

错误二:

错误三: 

错误四 :

字符串转换为时间以及时间的加减运算

带参数的SQL语句:

问号占位符:

命名变量占位符:

格式化字符串 :


 先讲错误,再说执行带参数的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()
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值