psycopg2 "TypeError: не все аргументы преобразованы во время форматирования строки" - PullRequest
10 голосов
/ 27 апреля 2009

Я пытаюсь вставить двоичные данные (хеш-файл) в таблицу PG и получаю сообщение об ошибке:

TypeError: not all arguments converted during string formatting 

код:

cur.execute("""
    INSERT INTO
        sessions
        (identity_hash, posted_on)
    VALUES
        (%s, NOW())
""", identity_hash) 

Я пытался добавить conn.Binary ("identity_hash") в переменную перед вставкой, но получил ту же ошибку.

Столбец identity_hash - это байт.

Есть идеи?

Ответы [ 3 ]

27 голосов
/ 29 сентября 2009

Проблема в том, что вы передаете объект в качестве второго параметра: вторые параметры должны быть либо кортежем, либо диктатом. Нет ярлыка, как в операторе% string.

Вы должны сделать:

cur.execute("""
    INSERT INTO
        sessions
        (identity_hash, posted_on)
    VALUES
        (%s, NOW())
""", (identity_hash,))
10 голосов
/ 09 января 2015

Обнаружил ту же проблему и обнаружил, что это на самом деле описано в их 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
6 голосов
/ 27 апреля 2009

Вы смотрели на скрипт "examples / binary.py" в дистрибутиве исходного кода 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)
...