2

私の質問は本質的に 2 つあります。まず、Python で実行している SQlite を使用したデータベースがあります。

私のデータベースは次のとおりです。

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,)

したがって、これは、ref 列を検索するための idn パラメータの処理方法に問題があることを示しています。私の最初の質問は、列 ref の idn に入力した値を検索するにはどうすればよいですか?

2 番目の質問は、値を (20,) の形式ではなく数値として出力するにはどうすればよいかということです。これは、後で Python に別の数値 x を加算または減算し、値を更新するように指示するためです。データベースのエントリを 20+x に変更するため、特定の参照エントリの数量列の値である変数を Python で作成しようとしています。

4

1 に答える 1

3

一連のパラメーターを渡す必要があり、1 つの要素を持つタプルにします。

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

Python 文字列もシーケンスであるため、idnが 5 文字の文字列の場合、python は長さ 5 のシーケンスを認識します。

データベースは、結果が 1 列しかない場合でも、常に列の行を返します。行は本質的に Python のタプル、つまりシーケンスです。idnパラメータと同じ問題ですが、逆です。インデックスを作成して、結果行から 1 列を取り出します。

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 に答える