2016-03-04 2 views
2

Работа с недавно приобретенным RaspberryPi, и я очень новичок в Python/MySQL, поэтому, пожалуйста, извините наивный вопрос, который я публикую. Я посмотрел на многие Q & A об этом, но я не могу показаться, чтобы моя голова «почему» это неудачно. Я получаю ошибку: "должен быть строковым или только для чтения буфером, а не кортежем". Моя переменная отображается в виде строки, если я тестирую ее с помощью TYPE, поэтому теперь я потерян.Передача строковой переменной в MySQL, сбой в качестве кортежа

import MySQLdb 
import time 
db = MySQLdb.connect(host="localhost", user="user",passwd="easypwd", db="imagepi") 
cursor = db.cursor() 
current_time = time.strftime("%H:%M:%S") 
current_date = time.strftime("%Y-%m-%d") 
filename = (current_time+'.jpg') 
sql = ("""INSERT INTO imagelocator(batch, date, time, filename) VALUES 
('1001', current_date, current_time, %s)""", filename) 
cursor.execute(sql) 
db.commit() 
db.close() 

Большое спасибо за предложение небольшого толчка в правильном направлении.

ответ

1

Переменная sql - это кортеж. Одна из них - это ваш оператор SQL, а другая половина - значение токена для параметра %s в вашем заявлении. Однако просто передача кортежа в аргумент не разбивает его и использует каждый элемент в кортеже как отдельный параметр. Для этого вам нужно использовать звездочку: function_to_call(*tuple_args) ... но я думаю, что у вас тоже будет проблема с этим, поскольку курсор базы данных ожидает строку для аргумента statement и последовательность для аргумента parameters. Аргумент parameters должен быть последовательностью (кортеж, список, набор и т. Д.) , даже если есть только одно значение.

TL; DR - Вы должны сделать что-то больше, как это:

sql = "INSERT INTO table_name (a_column, b_column) VALUES ('asdf', %s)" 
args = (filename,) 
cursor.execute(sql, args) 

... или, если вы действительно хотите быть шалунов и использовать кортеж для всего:

sql = ("INSERT INTO table_name (a_column, b_column) VALUES ('asdf', %s)", (filename,)) 
cursor.execute(*sql) 

Изменить: я думаю, я не уточнил ... при вложении строки с круглыми скобками не создается кортеж, добавление запятой делает. Итак, (string_var) не является кортежем, а (string_var,) есть. Надеюсь, это устранит любую путаницу с тем, как работает вышеуказанный код.

Кроме того, здесь есть документация на предмет звездочки; как скучные официальные документы и проще для понимания блоге:

+0

Я ценю ваш быстрый ответ. Позвольте мне перечитать его несколько раз и посмотреть ссылки, которые вы предоставили. Я уверен, что это приведет меня к правильному пути. Благодаря! – generatorlabs

+0

Всегда рад помочь. – haliphax