Psycopg2 "TypeError: не все аргументы, преобразованные во время форматирования строки"
Я пытаюсь вставить двоичные данные (хеш-вихрь) в таблицу PG, и я получаю сообщение об ошибке:
TypeError: not all arguments converted during string formatting
код:
cur.execute("""
INSERT INTO
sessions
(identity_hash, posted_on)
VALUES
(%s, NOW())
""", identity_hash)
Я попытался добавить conn.inary( "identity_hash" ) к переменной перед вставкой, но получить ту же ошибку.
Столбец identity_hash является байтом.
Любые идеи?
Ответы
Ответ 1
Вы рассмотрели "examples/binary.py" script в дистрибутиве psycopg2? Здесь хорошо работает. Он немного отличается от вашего отрывка:
data1 = {'id':1, 'name':'somehackers.jpg',
'img':psycopg2.Binary(open('somehackers.jpg').read())}
curs.execute("""INSERT INTO test_binary
VALUES (%(id)s, %(name)s, %(img)s)""", data1)
Ответ 2
Проблема заключается в том, что вы передаете объект в качестве второго параметра: вторым параметрам должен быть либо кортеж, либо dict. В операторе% string нет ярлыка.
Вам следует:
cur.execute("""
INSERT INTO
sessions
(identity_hash, posted_on)
VALUES
(%s, NOW())
""", (identity_hash,))
Ответ 3
Обнаружена та же проблема и выяснилось, что это фактически описано в их FAQ
Я пытаюсь выполнить запрос, но он терпит неудачу с ошибкой не всех аргументов преобразование во время форматирования строки (или объект не поддерживает индексация). Зачем? Psycopg всегда требует позиционных аргументов передается как последовательность, даже когда запрос принимает один параметр. И помните, что для создания одного кортежа в Python вам нужно запятая! См. "Передача параметров SQL-запросам".
cur.execute("INSERT INTO foo VALUES (%s)", "bar") # WRONG
cur.execute("INSERT INTO foo VALUES (%s)", ("bar")) # WRONG
cur.execute("INSERT INTO foo VALUES (%s)", ("bar",)) # correct
cur.execute("INSERT INTO foo VALUES (%s)", ["bar"]) # correct