2010-12-01 3 views
0

python 2.5.2を使用して以下のコードを実行しようとしています。スクリプトは接続を確立してテーブルを作成していますが、そのエラーは次のエラーで失敗しています。pythonのトラックバックエラー - pymssqlを使用しています

スクリプト

import pymssql 
conn = pymssql.connect(host='10.103.8.75', user='mo', password='the_password', database='SR_WF_MODEL') 
cur = conn.cursor() 
cur.execute('CREATE TABLE persons(id INT, name VARCHAR(100))') 
cur.executemany("INSERT INTO persons VALUES(%d, %s)", \ 
    [ (1, 'John Doe'), (2, 'Jane Doe') ]) 
conn.commit() 

cur.execute("SELECT * FROM persons WHERE salesrep='%s'", 'John Doe') 
row = cur.fetchone() 
while row: 
    print "ID=%d, Name=%s" % (row[0], row[1]) 
    row = cur.fetchone() 

cur.execute("SELECT * FROM persons WHERE salesrep LIKE 'J%'") 

conn.close() 

エラー

Traceback (most recent call last): 
    File "connect_to_mssql.py", line 9, in <module> 
    cur.execute("SELECT * FROM persons WHERE salesrep='%s'", 'John Doe') 
    File "/var/lib/python-support/python2.5/pymssql.py", line 126, in execute 
    self.executemany(operation, (params,)) 
    File "/var/lib/python-support/python2.5/pymssql.py", line 152, in executemany 
    raise DatabaseError, "internal error: %s" % self.__source.errmsg() 
pymssql.DatabaseError: internal error: None 

何か提案は?プラス、どのようにトレースバックのエラーを読んで、誰も私がエラーメッセージを理解するのを助けることができますか?どのようにそれを読むのですか?一気飲み?

+0

そのトレースバックは悪い冗談です。エラーが「None」の場合、なぜそれは不平ですか?そして、はい、トレースバックはボトムアップから読み込まれます。各行は、その下の行を呼び出す行です。 – aaronasterling

+2

'salesrep'というカラムはなく、' name'だけです。 –

答えて

1

私はあなたがすなわち、通常のPython文字列補間動作を想定していると思う:

>>> a = "we should never do '%s' when working with dbs" 
>>> a % 'this' 
"we should never do 'this' when working with dbs" 

executeメソッド内%オペレータは、通常の文字列フォーマット演算子のように見えるが、それは利便性のよりまたはニーモニックです。引用符なし

cur.execute("SELECT * FROM persons WHERE salesrep=%s", 'John Doe')

を、これはオライリーのような名前で動作し、データベースアダプタの設計あたりのSQLインジェクションを防ぐことができます:あなたのコードを読んでください。これは実際にデータベースアダプタが存在するところです。つまり、PythonオブジェクトをSQLに変換します。それは、文字列を引用し、適切にあなたがいた場合、それがうまくいくなど、句読点を脱出する方法を知っている:

>>> THING_ONE_SHOULD_NEVER_DO = "select * from table where cond = '%s'" 
>>> query = THING_ONE_SHOULD_NEVER_DO % 'john doe' 
>>> query 
"select * from table where cond = 'john doe'" 
>>> cur.execute(query) 

が、これは悪い習慣です。

関連する問題