Ошибка отслеживания Python - использование pymssql - PullRequest
0 голосов
/ 01 декабря 2010

я пытаюсь выполнить приведенный ниже код, используя python 2.5.2. Сценарий устанавливает соединение и создает таблицу, но затем завершается ошибкой с приведенной ниже ошибкой.

Сценарий

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

есть предложения? плюс, как вы читаете ошибку трассировки, кто-нибудь может помочь мне понять сообщение об ошибке? как ты это читаешь? вверх дном?

1 Ответ

1 голос
/ 01 декабря 2010

Я думаю, вы предполагаете обычное поведение интерполяции строки 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')

без кавычек, и это будет работать с именами, такими как O'Reilly, и поможет предотвратить внедрение 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)

, но это плохая практика.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...