Найти - Пользователи
Полная версия: Работа с Postgresql с помощью библиотеки libpq.so и модуля ctypes
Начало » Базы данных » Работа с Postgresql с помощью библиотеки libpq.so и модуля ctypes
1 2
AlexandrB
Добрый день.
Пытаюсь подключиться из python к БД на postgresql. Использую библиотеку libpq.so.5.10, подключенную через модуль ctypes. На данный момент получилось подключится к БД, получить от БД имя пользователя и рабочей базы данных, а также завершить соединение с помощью функций PQconnectdb, PQstatus, PQuser, PQdb и PQfinish. Следующий шаг - это попытка отправить запрос с помощью функции PQexec. Описание ее в документации (источник - https://postgrespro.ru/docs/postgresql/9.6/libpq-exec):
PQexec

Передаёт команду серверу и ожидает результата.

PGresult *PQexec(PGconn *conn, const char *command);

Возвращает указатель на PGresult или, возможно, пустой указатель (null). Как правило, возвращается непустой указатель, исключением являются ситуации нехватки памяти или серьёзные ошибки, такие, как невозможность отправки команды серверу. Для проверки возвращаемого значения на наличие ошибок следует вызывать функцию PQresultStatus (в случае нулевого указателя она возвратит PGRES_FATAL_ERROR). Для получения дополнительной информации о таких ошибках используйте функцию PQerrorMessage.
при попытке ее использования выходит ошибка:
Traceback (most recent call last):
File “testlib.py”, line 38, in <module>
info = PQexec(PGconn, “SELECT * FROM test;”)
ctypes.ArgumentError: argument 1: <type ‘exceptions.TypeError’>: expected PGconn instance instead of _ctypes.PyCStructType
Хотя структура PGconn работает с выше приведенными функциями без ошибки. Сама структура описана мной как:
 class PGconn(Structure):
    _fields_ = [("pg_conn_first_field", c_char_p),]
В документации по libpq написано, что клиентскому приложению не обязательно знать, а лучше не знать поля структуры.
Вопрос: в чем ошибка?
JOHN_16
А почему Вы используете именно *.so библиотеку,а не модуль питона psycopg2 ?
AlexandrB
Блин туплю)))
Вопрос снимается, я вместо переменной типа PGconn запихнул в функцию сам тип структуры.

JOHN_16
А почему Вы используете именно *.so библиотеку,а не модуль питона psycopg2 ?
модуль psycopg2 не является стандартным. И не во всех системах есть, и есть системы где нельзя ни чегосторонего добавлять. Вот по этомутакие извращения. Ну и интересно в принципе. Мож создам свой собственныймодуль для подключения к postgresql используя только стандартные модули.
JOHN_16
Вы явно занимаетесь глупостью. А типа libpq.so.5.10 является стандартом де факто? У меня в Linux Mint этот пакет не стоит по умолчанию к примеру.
AlexandrB
И не во всех системах есть
AlexandrB
сть системы где нельзя ни чегосторонего добавлять.
Почему это вообще должно быть критерием для выбора? То есть установить пакет нельзя, а положить свою программу и выполнить ее можно? К тому же pip умеет устанавливать в окружение пользователя, не говоря уже о том что можно использовать виртуальное окружение. Плюс я вполне верю что можно взять этот модуль и положить в ваш проект.
AlexandrB
Ну и интересно в принципе
Это совсем другая и разумная причина, не надо ее мешать со всем остальным перечисленным. Ибо с точки зрения профессионала, это какие то не корретные аргументы.
AlexandrB
JOHN_16
Вы явно занимаетесь глупостью. А типа libpq.so.5.10 является стандартом де факто? У меня в Linux Mint этот пакет не стоит по умолчанию к примеру.

таки есть рабочии места, где нет выхода в интернет. Дома у меня в mint тоже проблем нет, а вот на работе есть. В самой системе урезанный репозиторий. Что бы установить psycopg2 нужен кампилятор С, которого ни в системе ни в репах нет. Вот такая вот кака.
Кстати пробывал через сокет подключится, торможу на отправке пароля, сервер запрашивает пароль в MD5 с солью которую он прислал. Не могу пока панять как посолить пароль спомощью модуля hashlib.

кстати PQexec команду отправляет, но следующая за ним команда PQresStatus возвращает 0, что значит
PGRES_EMPTY_QUERY = 0, /* empty query string was executed */
.
В коде все выглядит так:
 PQexec = libpq.PQexec 
PQexec.argtypes = [PGconn, c_wchar_p]
info = PQexec(conn, "SELECT * FROM test;")
print info
PQresultStatus = libpq.PQresultStatus
PQresultStatus.argtype = [PGconn, ]
info = ExecStatusType[PQresultStatus(conn)]
print info
Хотя должен возвращать PGRES_TUPLES_OK (по порядку этодолжнобыть под номером 2)
JOHN_16
AlexandrB
Что бы установить psycopg2 нужен кампилятор С
этот модуль можно устанавливать через wheels бинарно. А его можно с собой таскать.
JOHN_16
AlexandrB
таки есть рабочии места, где нет выхода в интернет. Дома у меня в mint тоже проблем нет, а вот на работе есть. В самой системе урезанный репозиторий. Что бы установить psycopg2 нужен кампилятор С, которого ни в системе ни в репах нет. Вот такая вот кака.
ну тут можно посочувствовать. Тем не менее, исходя из соображений разработчика, Вы пошли сложным и не эффективным путем. Если бы все было чисто для фана - то пожалуйста,а если это по работе … тут всякое возможно, в зависимости от начальства ставящего задачу.
AlexandrB
Забыл написать - питон стоит версии 2.6, вот так вот.
А интерес уже не только по работе. Хорошая тренировка для кодинга на питоне.
py.user.next
AlexandrB
питон стоит версии 2.6
Сейчас вообще планируется закрытие второго питона. Всех уже давно ждут на третьем, который вышел в 2009 году.

AlexandrB
таки есть рабочии места, где нет выхода в интернет.
Может, пора это самое… покинуть их и оставить в гордом одиночестве с их питоном 2.6 в обнимку.
AlexandrB
py.user.next
Сейчас вообще планируется закрытие второго питона. Всех уже давно ждут на третьем, который вышел в 2009 году.
py.user.next
Может, пора это самое… покинуть их и оставить в гордом одиночестве с их питоном 2.6 в обнимку.
Это называется импорт замещение и переход на отечественное ПО . А так представтье, что я на необитаемом острове, у меня есть две доски и гвоздь, а также задача сооденить эти две доски гвоздем. Все знают, что лучший инструмент это молоток. Его можно купить в магазине или попросить у соседа. Но это необитаемый остров, здесь нет соседей и нет чертовых магазинов.
Но все это можно обсудить в курилке. А тут…
У вас есть какие нибудь решения по данной проблеме? Почему функция PGexec передает пустую строку серверу postgres?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB