已传入所有参数,为何Python SQLite数据库单元测试仍失败?
问题分析与解决
核心问题
你调用backend.insert的方式完全不符合该函数的定义。从错误提示能看出,insert函数要求传入title、author、year、maincharacter、place这些独立的位置参数,但你却传入了混乱的SQL字符串片段和元组,导致函数找不到所需的参数。
错误代码问题点
语法错误:你的insert调用里字符串未正确闭合,参数传递的写法完全不符合Python语法,比如:
backend.insert("""INSERT INTO `book`"", (title, author, year, maincharacter, place) ('5', 'Harry Potter', 'JK Rowling', '2000','Harry','Closet' )""")这段代码既不是正确的字符串拼接,也不是合法的函数参数传递方式。
对
backend.insert函数的误解:该函数不是直接接收SQL语句作为参数,而是已经封装了插入逻辑,需要你传入具体的字段值。
修正后的单元测试用例
假设backend.insert的定义是接收title、author、year、maincharacter、place这几个参数(从错误提示反推),修正后的测试代码如下:
import unittest import backend class MyTestCase(unittest.TestCase): def test_db_write(self): # 直接传入字段值给insert函数,而非自定义SQL语句 self.assertEqual(backend.insert('Harry Potter', 'JK Rowling', '2000', 'Harry', 'Closet'), True) # 第二个插入用不同的参数避免重复(如果表有唯一约束) self.assertEqual(backend.insert('Harry Potter: Chamber of Secrets', 'JK Rowling', '2002', 'Harry', 'Hogwarts'), True) # 关于delete:如果delete函数同样是封装好的(接收id参数),改成如下形式 # 假设插入后返回的id或者你知道要删除的id值 # self.assertEqual(backend.delete(5), True) # self.assertEqual(backend.delete(6), True) # 如果delete确实是接收SQL语句,原写法可以保留,但要确保SQL语法正确 self.assertEqual(backend.delete("DELETE FROM `book` WHERE id='5'"), True) self.assertEqual(backend.delete("DELETE FROM `book` WHERE id='6'"), True) if __name__ == '__main__': unittest.main()
额外建议
- 查看
backend.py里insert函数的具体定义,确认参数顺序和要求,比如是否需要传入id(如果id是自增主键,通常不需要手动传入,函数内部会处理)。 - 执行SQL操作时尽量使用参数化查询(
backend.insert内部应该已经实现),避免SQL注入风险,同时保证语法正确。
内容的提问来源于stack exchange,提问作者google
相关产品推荐
相关产品推荐

