Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 9, 2019 12:48:21

AlexandrB
Зарегистрирован: 2019-08-09
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с Postgresql с помощью библиотеки libpq.so и модуля ctypes

Добрый день.
Пытаюсь подключиться из 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 написано, что клиентскому приложению не обязательно знать, а лучше не знать поля структуры.
Вопрос: в чем ошибка?

Офлайн

#2 Авг. 9, 2019 12:54:36

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Работа с Postgresql с помощью библиотеки libpq.so и модуля ctypes

А почему Вы используете именно *.so библиотеку,а не модуль питона psycopg2 ?



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Авг. 9, 2019 13:00:15

AlexandrB
Зарегистрирован: 2019-08-09
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с Postgresql с помощью библиотеки libpq.so и модуля ctypes

Блин туплю)))
Вопрос снимается, я вместо переменной типа PGconn запихнул в функцию сам тип структуры.

JOHN_16
А почему Вы используете именно *.so библиотеку,а не модуль питона psycopg2 ?
модуль psycopg2 не является стандартным. И не во всех системах есть, и есть системы где нельзя ни чегосторонего добавлять. Вот по этомутакие извращения. Ну и интересно в принципе. Мож создам свой собственныймодуль для подключения к postgresql используя только стандартные модули.

Офлайн

#4 Авг. 9, 2019 16:04:59

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Работа с Postgresql с помощью библиотеки libpq.so и модуля ctypes

Вы явно занимаетесь глупостью. А типа libpq.so.5.10 является стандартом де факто? У меня в Linux Mint этот пакет не стоит по умолчанию к примеру.

AlexandrB
И не во всех системах есть
AlexandrB
сть системы где нельзя ни чегосторонего добавлять.
Почему это вообще должно быть критерием для выбора? То есть установить пакет нельзя, а положить свою программу и выполнить ее можно? К тому же pip умеет устанавливать в окружение пользователя, не говоря уже о том что можно использовать виртуальное окружение. Плюс я вполне верю что можно взять этот модуль и положить в ваш проект.
AlexandrB
Ну и интересно в принципе
Это совсем другая и разумная причина, не надо ее мешать со всем остальным перечисленным. Ибо с точки зрения профессионала, это какие то не корретные аргументы.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#5 Авг. 9, 2019 17:15:17

AlexandrB
Зарегистрирован: 2019-08-09
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с Postgresql с помощью библиотеки libpq.so и модуля ctypes

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)

Отредактировано AlexandrB (Авг. 9, 2019 17:16:39)

Офлайн

#6 Авг. 9, 2019 17:22:46

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Работа с Postgresql с помощью библиотеки libpq.so и модуля ctypes

AlexandrB
Что бы установить psycopg2 нужен кампилятор С
этот модуль можно устанавливать через wheels бинарно. А его можно с собой таскать.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#7 Авг. 9, 2019 17:35:30

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Работа с Postgresql с помощью библиотеки libpq.so и модуля ctypes

AlexandrB
таки есть рабочии места, где нет выхода в интернет. Дома у меня в mint тоже проблем нет, а вот на работе есть. В самой системе урезанный репозиторий. Что бы установить psycopg2 нужен кампилятор С, которого ни в системе ни в репах нет. Вот такая вот кака.
ну тут можно посочувствовать. Тем не менее, исходя из соображений разработчика, Вы пошли сложным и не эффективным путем. Если бы все было чисто для фана - то пожалуйста,а если это по работе … тут всякое возможно, в зависимости от начальства ставящего задачу.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#8 Авг. 9, 2019 17:54:12

AlexandrB
Зарегистрирован: 2019-08-09
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с Postgresql с помощью библиотеки libpq.so и модуля ctypes

Забыл написать - питон стоит версии 2.6, вот так вот.
А интерес уже не только по работе. Хорошая тренировка для кодинга на питоне.

Офлайн

#9 Авг. 10, 2019 03:09:55

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 8419
Репутация: +  756  -
Профиль   Отправить e-mail  

Работа с Postgresql с помощью библиотеки libpq.so и модуля ctypes

AlexandrB
питон стоит версии 2.6
Сейчас вообще планируется закрытие второго питона. Всех уже давно ждут на третьем, который вышел в 2009 году.

AlexandrB
таки есть рабочии места, где нет выхода в интернет.
Может, пора это самое… покинуть их и оставить в гордом одиночестве с их питоном 2.6 в обнимку.



Отредактировано py.user.next (Авг. 10, 2019 03:11:10)

Офлайн

#10 Авг. 10, 2019 10:20:47

AlexandrB
Зарегистрирован: 2019-08-09
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с Postgresql с помощью библиотеки libpq.so и модуля ctypes

py.user.next
Сейчас вообще планируется закрытие второго питона. Всех уже давно ждут на третьем, который вышел в 2009 году.
py.user.next
Может, пора это самое… покинуть их и оставить в гордом одиночестве с их питоном 2.6 в обнимку.
Это называется импорт замещение и переход на отечественное ПО . А так представтье, что я на необитаемом острове, у меня есть две доски и гвоздь, а также задача сооденить эти две доски гвоздем. Все знают, что лучший инструмент это молоток. Его можно купить в магазине или попросить у соседа. Но это необитаемый остров, здесь нет соседей и нет чертовых магазинов.
Но все это можно обсудить в курилке. А тут…
У вас есть какие нибудь решения по данной проблеме? Почему функция PGexec передает пустую строку серверу postgres?

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version