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