【问题标题】:Returning department courses in databases返回数据库中的部门课程
【发布时间】:2017-12-03 23:39:44
【问题描述】:

我认为我有正确的想法来执行此功能,但我不确定我为什么会得到 当我测试它时出现这个错误。谁能帮我解决这个问题?

cur.execute(q)

sqlite3.ProgrammingError:提供的绑定数量不正确。这 当前语句使用 1,并且提供了 0。

当前尝试

def find_dept_courses(db, dept):
'''Return the courses from the given department.  Use  the "LIKE" 
   clause in your SQL query for the course name.'''
return run_query(db, '''SELECT DISTINCT Course FROM Courses WHERE
                        Course LIKE  (? + 'dept%')''')

期望的输出

find_dept_courses('exams.db', 'BIO')

# [('BIOA01H3F',), ('BIOA11H3F',), ('BIOB10H3F',), ('BIOB33H3F',), 
#  ('BIOB34H3F',), ('BIOB50H3F',), ('BIOC12H3F',), ('BIOC15H3F',), 
#  ('BIOC19H3F',), ('BIOC32H3F',), ('BIOC37H3F',), ('BIOC50H3F',), 
#  ('BIOC58H3F',), ('BIOC59H3F',), ('BIOC61H3F',), ('BIOC63H3F',), 
#  ('BIOD21H3F',), ('BIOD22H3F',), ('BIOD23H3F',), ('BIOD26H3F',), 
#  ('BIOD33H3F',), ('BIOD48H3F',), ('BIOD65H3F',)]

查询函数:

def run_query(db, q, args=None):
"""(str, str, tuple) -> list of tuple
Return the results of running query q with arguments args on
database db."""

conn = sqlite3.connect(db)
cur = conn.cursor()
# execute the query with the given args passed
# if args is None, we have only a query
if args is None:
    cur.execute(q)
else:
    cur.execute(q, args)

results = cur.fetchall()
cur.close()
conn.close()
return results

【问题讨论】:

  • Sqlite 语句中的? 是一个占位符,必须用具体值填充(通常在执行语句时作为参数附加)
  • 好的,我该如何解决这个问题?
  • 尝试删除? + 部分。这不是最好的方法,但应该可以。
  • 我只是得到空列表。我没有得到想要的输出。
  • 检查我的编辑。我添加了查询功能。

标签: python sql database


【解决方案1】:

使用.execute 时,您需要将参数作为列表或元组传递,这里是示例

# This is the qmark style:
cur.execute("insert into people values (?, ?)", (who, age))

【讨论】:

    【解决方案2】:

    目前,您正在使用占位符,但未传递任何参数。其次,您将占位符 ?LIKE 表达式中的数据值连接起来。

    只需将查询语句和数据值分开,自己留下?

    def find_dept_courses(db, dept):
        sql = '''SELECT DISTINCT Course FROM Courses WHERE Course LIKE ?'''
    
        return run_query(db, sql, args=(dept+'%',))
    

    【讨论】:

    • 您是否运行了我提出的解决方案?
    • 是的,我现在收到此错误 cur.execute(q, args) sqlite3.ProgrammingError: 提供的绑定数量不正确。当前语句使用 1,提供了 4 个。
    • 嗯……很奇怪!您确定您传递的是像 BIO 这样的标量字符串,而不是 dept 的列表吗?
    • 是的。 find_dept_courses(db, 'BIO') cur.execute(q, args) sqlite3.ProgrammingError: 提供的绑定数量不正确。当前语句使用 1,提供了 4 个。
    • 我在 dept 变量中传递一个字符串。
    【解决方案3】:

    删除 ?并解析您的 sql 语法,以便将 dept 视为变量,例如sql 应该评估为

    从哪里的课程中选择不同的课程 课程 LIKE 'mydept%'

    请注意,使用此方法您可能容易受到 sql 注入的影响,并且 dept 来自用户输入

    【讨论】:

    • 我不知道您使用的是什么语言,但如果您在 sql 中尝试过,它确实可以工作。您的字符串应评估为 SELECT DISTINCT Course FROM Courses WHERE Course LIKE ('mydepthere%')
    • 我正在使用 python。
    • 我不是 python 开发人员,但我假设您在 SQL 周围传递带有单引号的字符串。例如:dept = 'mydept' sql = '\'SELECT DISTINCT Course FROM Courses WHERE Course LIKE \'' + dept + '%\')\'' print sql
    • 如果你不需要 sql 周围的单引号,那么这也可以:sql = 'SELECT DISTINCT Course FROM Courses WHERE Course LIKE \'' + dept + '%\''跨度>
    • 对不起,我之前的语法错误。单引号示例应该是:sql = '\'SELECT DISTINCT Course FROM Courses WHERE Course LIKE \'' + dept + '%\'\''
    猜你喜欢
    • 1970-01-01
    • 2019-08-17
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2013-08-24
    • 1970-01-01
    • 2018-09-14
    相关资源
    最近更新 更多