Я использую psycopg2, чтобы попытаться вставить запись в таблицу, где тип данных - это тип Postgres «uuid».
Согласно эта страница, я должен иметь возможность напрямую использовать тип Python uuid.UUID, как в следующем коде:
uuid_entry = uuid.uuid4()
command = "INSERT INTO MyTable (uuid) VALUES (%s)"
cursor.execute(command, (uuid_entry,))
Однако, когда я пытаюсь это сделать, возникает ошибка:
ProgrammingError(can't adapt type 'UUID')
Есть идеи, почему это происходит? Спасибо.
@ShawnMehan Хммм, похоже, что вывод psycopg2.extensions.adapt (my_uuid) .getquoted () в моем случае немного отличался: b "'2d10d790-f2de-4de5-aaba-7095e04f39cb' :: uuid". Вроде бы в б "...".
b сообщает вам, что это binary string. Но вы должны попробовать получить другой идентификатор из своей базы данных, вытащить этот идентификатор и сравнить его тип и формат с тем, который вы создаете. Убедитесь, что они оба выглядят одинаково внутри python.
@ShawnMehan Похоже, я смог решить проблему с помощью psycopg2.extras.register_uuid() до того, как вызвать в cursor.execute.





uuid_entry = str(uuid.uuid4())
У меня это работает. Не уверен, что это правильный подход.
Этот ответ работает идеально. Не уверен, для чего нужна регистрация.
Как отметил автор в комментариях, для передачи объектов UUID в методы курсора нужно сначала один раз вызвать register_uuid():
import psycopg2.extras
# call it in any place of your program
# before working with UUID objects in PostgreSQL
psycopg2.extras.register_uuid()
# now you can pass UUID objects into psycopg2 functions
cursor.execute("INSERT INTO MyTable (uuid) VALUES (%s)", (uuid.uuid4(),))
# ... and even get it from there
cursor.execute("SELECT uuid FROM MyTable")
value, = cursor.fetchone()
assert isinstance(value, uuid.UUID)
Обратите внимание, что вы также должны добавить import psycopg2.extras, прежде чем сможете регистрировать UUID.
Удалось ли вам проверить
uuid_entryв отладчике? Удалось ли вам успешно запрос строки с даннымuuidа-ля initd.org/psycopg/docs/extras.html#adapt-uuid?