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

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

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

Ещё одна памятка на тему, навеянную обсуждением
Проблема подключения к базе данных 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)
Смотрим результаты:
Код:
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, из которого подтягивается клиентская часть, не мешает
загрузке драйвера.
Размещено в Памятка
Показов 4024 Комментарии 0
Всего комментариев 0
Комментарии
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru