Проблема подстановки переменных в Python 2.7 в операторе MYsql - PullRequest
0 голосов
/ 01 ноября 2018

Спасибо за чтение. У меня есть некоторый опыт работы с SQL, очень новый для python.

В приведенном ниже коде я обращаюсь к 2 базам данных в Python 2.7 Соединения работают. Я могу запросить таблицы с серийными номерами для устройств в одном операторе без проблем. Затем я хочу запросить таблицу, имя которой соответствует этому серийному номеру в другой базе данных, извлекая последнее значение из поля «Штамп». Все это работает, когда я явно называю таблицу ccnbsc00000001, но при использовании переменной подстановки происходит сбой.

Когда подставляется переменная currentdevice, включаются дополнительные символы. Когда я печатаю эту переменную, эти символы не присутствуют в этом выводе. здесь код и результат ошибки внизу

#!/usr/bin/python
### Imports
import datetime
import mysql.connector
#Connect to heartbeat results database
hb_db = mysql.connector.connect(
  host="localhost",
  user="otheruser",
  passwd="******",
  database="active_devices"
)
#Connect to heartbeat results database
device_Settings_db = mysql.connector.connect(
  host="localhost",
  user="otheruser",
  passwd="******",
  database="active_devices"
)
device_settings_cursor = device_settings_db.cursor()
hb_cursor = hb_db.cursor()
## Get deviuce serial#
device_settings_cursor.execute('select device_serial from devices')
active_devices = device_settings_cursor.fetchall()
print ("these are the current devices:")
print (active_devices)
for device in active_devices:

 currentdevice = device[0]
 print(currentdevice)

 print ("SELECT MAX(stamp) FROM (%s)" , (currentdevice,) )
 hb_cursor.execute('SELECT MAX(stamp) FROM (%s)' , (currentdevice,) )

 laststamp = hb_cursor.fetchone
 laststamp = laststamp[0]
 print("Last time stamp is:")
 print(laststamp)


*

Вывод на печать (active_devices) [(u'ccnbsc00000001 ',), (u'ccnbsc00000002',)]

вывод на печать (currentdevice) ccnbsc00000001 (Это правильный вывод / значение)

но я получаю эту ошибку в запросе SQL, которая подразумевает, что он сохранил окружающие символы 'и')

Traceback (most recent call last):
  File "./hb_notify.py", line 61, in <module>
    hb_cursor.execute('SELECT MAX(stamp) FROM (%s)' , (currentccn,) )
  File "/usr/lib/python2.7/site-packages/mysql/connector/cursor.py", line 551, in execute
self._handle_result(self._connection.cmd_query(stmt))
  File "/usr/lib/python2.7/site-packages/mysql/connector/connection.py", line 490, in cmd_query
  result = self._handle_result(self._send_cmd(ServerCmd.QUERY, query))
File "/usr/lib/python2.7/site-packages/mysql/connector/connection.py", line 395, in _handle_result
  raise errors.get_exception(packet)
mysql.connector.errors.ProgrammingError: 1064 (42000): You have an error in your **SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''ccnbsc00000001')' at line 1**

1 Ответ

0 голосов
/ 01 ноября 2018

Библиотеки Python MySQL обычно вставляют кавычки, когда вы передаете строковые аргументы в качестве аргументов, потому что обычно вам действительно нужны эти кавычки. Вот почему вы видите кавычки.

Исправление здесь простое: вместо передачи этих значений в качестве аргументов вашему курсору, вы можете просто вставить эти значения непосредственно в строку, как если бы это была любая другая строка Python. Вот так:

hb_cursor.execute('SELECT MAX(stamp) FROM {0}'.format(currentdevice))

Строковые аргументы Python удаляют кавычки вокруг строки, аргументы курсора MySQL сохраняют кавычки.

...