Форум программистов, компьютерный форум, киберфорум
iamvic
Войти
Регистрация
Восстановить пароль
Путевые заметки в процессе познания Python и PyQt/PySide.
Помни - только тег CODE не портит код добавлением пробела в начало пустой строки.

К вопросу о доступе из Python к PostgreSQL.

Запись от iamvic размещена 12.12.2020 в 15:58
Показов 4613 Комментарии 0

Ещё одна памятка на тему, навеянную обсуждением
Проблема подключения к базе данных PostgreSQL с PyQt5.QtSql. Драйвер не загружен.
Что делать, если надо обеспечить доступ к PostgreSQL из двух Python-ов разной разрядности,
установленных в одной системе (например, мой стенд https://www.cyberforum.ru/blog... g6863.html)?
Ведь каждому требуется своё...

На самом-то деле, Python-у от установленного в системе PostgreSQL для работы требуется только
соответствующая клиентская часть, а PostgreSQL отличается тем, что у него нет отдельного клиента.
Его надо ставить целиком, даже если на конкретном рабочем месте локальный сервер не нужен.
В этом случае службу PostgreSQL можно просто остановить, отключить, запретить запуск при старте,
например, через Панель управления -> Администрирование -> Службы компонентов -> Службы (локальные)
находим соответствующую службу с именем postgresql-..., останавливаем её и меняем тип запуска
Автоматический -> Вручную. Более экзотичный способ состоит в выколупывании DLL-ек, ответственных
за клиентскую часть PostgreSQL (спасибо vic5710 за ссылочку http://kostyan9k.blogspot.com/... resql.html,
обнародованную в Проблема подключения к базе данных PostgreSQL с PyQt5.QtSql. Драйвер не загружен).

Остаётся только попробовать реализовать на практике возможные решения.
В установленных на стенде Python-ах обновляем pip и устанавливаем PyQt5.
Ставим PostgreSQL v10.15.1 разрядности 64-bit и 32-bit.
Останавливаем и запрещаем запуск при старте 32-битного PostgreSQL.
Пишем скриптик, в котором при указании параметра будет подсовываться PostgreSQL с разрядностью,
отличной от разрядности Python:

pgsql_check.py:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#!/usr/bin/python3
# -*- coding: utf-8 -*-
 
import sys, os, platform
from PyQt5.QtWidgets import QApplication
from PyQt5.QtSql import QSqlDatabase
 
PGSQL32_BIN = 'C:\\Program Files (x86)\\PostgreSQL\\10\\bin'
PGSQL32_LIB = 'C:\\Program Files (x86)\\PostgreSQL\\10\\lib'
PGSQL_BIN = 'C:\\Program Files\\PostgreSQL\\10\\bin'
PGSQL_LIB = 'C:\\Program Files\\PostgreSQL\\10\\lib'
 
if __name__ == '__main__':
    _path = os.environ['PATH']
 
    if sys.platform == 'win32' and platform.machine() == 'x86':
        print('Windows (32bit) and Python (32bit)')
        print('PostgreSQL (32bit)')
        os.environ['PATH'] = '{!s};{!s};{!s}'.format(
            PGSQL_BIN, PGSQL_LIB, _path)
 
    elif sys.platform == 'win32' and sys.maxsize > 0x100000000:
        print('Windows (64bit) and Python (64bit)')
        if len(sys.argv) > 1:
            print('PostgreSQL (32bit)')
            os.environ['PATH'] = '{!s};{!s};{!s}'.format(
                PGSQL32_BIN, PGSQL32_LIB, _path)
        else:
            print('PostgreSQL (64bit)')
            os.environ['PATH'] = '{!s};{!s};{!s}'.format(
                PGSQL_BIN, PGSQL_LIB, _path)
 
    elif sys.platform == 'win32':
        print('Windows (64bit) and Python (32bit)')
        if len(sys.argv) <= 1:
            print('PostgreSQL (32bit)')
            os.environ['PATH'] = '{!s};{!s};{!s}'.format(
                PGSQL32_BIN, PGSQL32_LIB, _path)
        else:
            print('PostgreSQL (64bit)')
            os.environ['PATH'] = '{!s};{!s};{!s}'.format(
                PGSQL_BIN, PGSQL_LIB, _path)
 
    else:
        print('NO WINDOWS ZONE!!!')
 
    print('os.environ["PATH"] =', os.environ['PATH'])
 
    app = QApplication(sys.argv)
    db = QSqlDatabase.addDatabase('QPSQL')
    print('db.driverName() =', db.driverName())
    print('db.isValid() =', db.isValid())
    sys.exit(0)
Смотрим результаты:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
C:\Tools>py32 pgsql_check.py
Windows (64bit) and Python (32bit)
PostgreSQL (32bit)
os.environ["PATH"] = C:\Program Files (x86)\PostgreSQL\10\bin;C:\Program Files (
x86)\PostgreSQL\10\lib;C:\Program Files (x86)\Python38-32\lib\site-packages\PyQt
5\Qt\bin;C:\Program Files (x86)\Python38-32\Scripts\;C:\Program Files (x86)\Pyth
on38-32\;C:\Tools;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Win
dows\System32\WindowsPowerShell\v1.0\
db.driverName() = QPSQL
db.isValid() = True
 
C:\Tools>py32 pgsql_check.py 1
Windows (64bit) and Python (32bit)
PostgreSQL (64bit)
os.environ["PATH"] = C:\Program Files\PostgreSQL\10\bin;C:\Program Files\Postgre
SQL\10\lib;C:\Program Files (x86)\Python38-32\lib\site-packages\PyQt5\Qt\bin;C:\
Program Files (x86)\Python38-32\Scripts\;C:\Program Files (x86)\Python38-32\;C:\
Tools;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System3
2\WindowsPowerShell\v1.0\
QSqlDatabase: QPSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QODBC QODBC3 QPSQL QPSQL7
db.driverName() = QPSQL
db.isValid() = False
 
C:\Tools>py64 pgsql_check.py
Windows (64bit) and Python (64bit)
PostgreSQL (64bit)
os.environ["PATH"] = C:\Program Files\PostgreSQL\10\bin;C:\Program Files\Postgre
SQL\10\lib;C:\Program Files\Python38\lib\site-packages\PyQt5\Qt\bin;C:\Program F
iles\Python38\Scripts\;C:\Program Files\Python38\;C:\Tools;C:\Windows\system32;C
:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\
db.driverName() = QPSQL
db.isValid() = True
 
C:\Tools>py64 pgsql_check.py 1
Windows (64bit) and Python (64bit)
PostgreSQL (32bit)
os.environ["PATH"] = C:\Program Files (x86)\PostgreSQL\10\bin;C:\Program Files (
x86)\PostgreSQL\10\lib;C:\Program Files\Python38\lib\site-packages\PyQt5\Qt\bin;
C:\Program Files\Python38\Scripts\;C:\Program Files\Python38\;C:\Tools;C:\Window
s\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerS
hell\v1.0\
QSqlDatabase: QPSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QODBC QODBC3 QPSQL QPSQL7
db.driverName() = QPSQL
db.isValid() = False
Подводим итоги:
1. для получения доступа из Python к PostgreSQL необходимо и достаточно добавить пути к клиентской
части PostgreSQL соответствующей разрядности в переменную окружения PATH текущей сессии.
Общесистемную трогать не надо.
2. PostgreSQL, из которого подтягивается клиентская часть, должен соответствовать разрядности Python.
3. отключение локального сервера PostgreSQL, из которого подтягивается клиентская часть, не мешает
загрузке драйвера.
Размещено в Памятка
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии
 
Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru