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

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

Запись от iamvic размещена 12.12.2020 в 15:58
Показов 4545 Комментарии 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
Комментарии
 
Новые блоги и статьи
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru