Форум сайта python.su
Добрый день.
Пытаюсь подключиться из 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):Хотя структура PGconn работает с выше приведенными функциями без ошибки. Сама структура описана мной как:
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
class PGconn(Structure): _fields_ = [("pg_conn_first_field", c_char_p),]
Офлайн
А почему Вы используете именно *.so библиотеку,а не модуль питона psycopg2 ?
Офлайн
Блин туплю)))
Вопрос снимается, я вместо переменной типа PGconn запихнул в функцию сам тип структуры.
JOHN_16модуль psycopg2 не является стандартным. И не во всех системах есть, и есть системы где нельзя ни чегосторонего добавлять. Вот по этомутакие извращения. Ну и интересно в принципе. Мож создам свой собственныймодуль для подключения к postgresql используя только стандартные модули.
А почему Вы используете именно *.so библиотеку,а не модуль питона psycopg2 ?
Офлайн
Вы явно занимаетесь глупостью. А типа libpq.so.5.10 является стандартом де факто? У меня в Linux Mint этот пакет не стоит по умолчанию к примеру.
AlexandrB
И не во всех системах есть
AlexandrBПочему это вообще должно быть критерием для выбора? То есть установить пакет нельзя, а положить свою программу и выполнить ее можно? К тому же pip умеет устанавливать в окружение пользователя, не говоря уже о том что можно использовать виртуальное окружение. Плюс я вполне верю что можно взять этот модуль и положить в ваш проект.
сть системы где нельзя ни чегосторонего добавлять.
AlexandrBЭто совсем другая и разумная причина, не надо ее мешать со всем остальным перечисленным. Ибо с точки зрения профессионала, это какие то не корретные аргументы.
Ну и интересно в принципе
Офлайн
JOHN_16
Вы явно занимаетесь глупостью. А типа libpq.so.5.10 является стандартом де факто? У меня в Linux Mint этот пакет не стоит по умолчанию к примеру.
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
Отредактировано AlexandrB (Авг. 9, 2019 17:16:39)
Офлайн
AlexandrBэтот модуль можно устанавливать через wheels бинарно. А его можно с собой таскать.
Что бы установить psycopg2 нужен кампилятор С
Офлайн
AlexandrBну тут можно посочувствовать. Тем не менее, исходя из соображений разработчика, Вы пошли сложным и не эффективным путем. Если бы все было чисто для фана - то пожалуйста,а если это по работе … тут всякое возможно, в зависимости от начальства ставящего задачу.
таки есть рабочии места, где нет выхода в интернет. Дома у меня в mint тоже проблем нет, а вот на работе есть. В самой системе урезанный репозиторий. Что бы установить psycopg2 нужен кампилятор С, которого ни в системе ни в репах нет. Вот такая вот кака.
Офлайн
Забыл написать - питон стоит версии 2.6, вот так вот.
А интерес уже не только по работе. Хорошая тренировка для кодинга на питоне.
Офлайн
AlexandrBСейчас вообще планируется закрытие второго питона. Всех уже давно ждут на третьем, который вышел в 2009 году.
питон стоит версии 2.6
AlexandrBМожет, пора это самое… покинуть их и оставить в гордом одиночестве с их питоном 2.6 в обнимку.
таки есть рабочии места, где нет выхода в интернет.
Отредактировано py.user.next (Авг. 10, 2019 03:11:10)
Офлайн
py.user.next
Сейчас вообще планируется закрытие второго питона. Всех уже давно ждут на третьем, который вышел в 2009 году.
py.user.nextЭто называется импорт замещение и переход на отечественное ПО . А так представтье, что я на необитаемом острове, у меня есть две доски и гвоздь, а также задача сооденить эти две доски гвоздем. Все знают, что лучший инструмент это молоток. Его можно купить в магазине или попросить у соседа. Но это необитаемый остров, здесь нет соседей и нет чертовых магазинов.
Может, пора это самое… покинуть их и оставить в гордом одиночестве с их питоном 2.6 в обнимку.
Офлайн