2

我的问题基本上是双重的。首先,我有一个使用 SQlite 的数据库,我使用 Python 运行它。

我的数据库是:

CREATE TABLE cards (id integer primary key autoincrement not null, ref text unique
check(ref!=''), name text, description text, quantity integer default 0, cat1 text,
cat2 text);

INSERT INTO "cards" VALUES(1,'lx247','green door',NULL,20,'abstract','');
INSERT INTO "cards" VALUES(2,'lxx247','green door',NULL,20,'abstract','');
INSERT INTO "cards" VALUES(3,'lxx2f47','green door',NULL,20,'abstract','');

我正在运行以下 python 代码:

import sqlite3 as lite
import sys
con = lite.connect('cards.db')
idn = raw_input("Enter your ID number")
with con:
    cur=con.cursor()
    cur.execute("SELECT quantity FROM cards WHERE ref=?", idn)  
    print "Quantity" + str(cur.fetchone())

首先,当我执行此脚本并在提示符中输入“lx247”时,我收到以下错误消息:

Enter your ID numberlx247
Traceback (most recent call last):
  File "test1.py", line 7, in <module>
    cur.execute("SELECT quantity FROM cards WHERE ref=?", idn)  
sqlite3.ProgrammingError: Incorrect number of bindings supplied. 
The current statement uses 1, and there are 5 supplied.

我已经确定它所指的 5 是我在 idn 输入 (lx247) 中输入的字符数。如果我换行:

cur.execute("SELECT quantity FROM cards WHERE ref=?", idn)  

cur.execute("SELECT quantity FROM cards WHERE id=?", idn)   

并在提示符处输入'2',它返回:

Enter your ID number2
Quantity(20,)

所以这告诉我它处理 idn 参数以查找 ref 列的方式有问题。所以我的第一个问题是如何让它在 ref 列中查找我在 idn 中输入的值

第二个问数据库中的条目为 20+x,所以我希望在 python 中创建一个变量,它是某个参考条目的数量列的值。

4

1 回答 1

3

您需要传入一系列参数,使其成为具有一个元素的元组:

cur.execute("SELECT quantity FROM cards WHERE ref=?", (idn,))  

Python 字符串也是序列,所以如果idn是 5 个字符的字符串,python 会看到一个长度为 5 的序列。

数据库总是返回多行列,即使是只有一列的结果。行本质上是一个 Python 元组,一个序列。这与您的参数问题相同idn,但相反。通过索引从结果行中取出一列:

print "Quantity " + str(cur.fetchone()[0])

示例数据库的快速演示:

>>> import sqlite3
>>> con = sqlite3.connect(':memory:')
>>> con.executescript('''\
... CREATE TABLE cards (id integer primary key autoincrement not null, ref text unique
... check(ref!=''), name text, description text, quantity integer default 0, cat1 text,
... cat2 text);
... 
... INSERT INTO "cards" VALUES(1,'lx247','green door',NULL,20,'abstract','');
... INSERT INTO "cards" VALUES(2,'lxx247','green door',NULL,20,'abstract','');
... INSERT INTO "cards" VALUES(3,'lxx2f47','green door',NULL,20,'abstract','');
... ''')
<sqlite3.Cursor object at 0x10ad66ab0>
>>> idn = 'lx247'
>>> cur=con.cursor()
>>> cur.execute("SELECT quantity FROM cards WHERE ref=?", (idn,))
<sqlite3.Cursor object at 0x10ad66b20>
>>> print "Quantity " + str(cur.fetchone()[0])
Quantity 20
于 2013-04-25T18:40:00.803 回答