PyQt Digest, Vol 191, Issue 9

Dennis Jensen djensen at pgcontrols.com
Wed Jun 10 23:37:05 BST 2020


Actually I think what I said got totally misunderstood -- because none 
of that is what I said nor implied

Okay MVC or (M-C-V) methodology is extremely simple in concept -- you 
have a front-end that renders information some how (such as your GUI, or 
printed report, or...) and you have a middle-tier that handles 
communication between the front-end(s) and back-end(s) and then you have 
the back-end (which is usually some kind of data source such as a 
database, serial device, or ...). Assuming a database it makes no 
difference what that database engine is as they are, from a coding 
standing point, interfaced in a similar manner and I have worked with 
numerous databases. However, I am not saying rewrite the database no use 
the database to do what it supposed to do handle data storage and the 
querying of that data be it queries you write and send in or you access 
stored procedures (because that particular database supports these) .

So you have -- Consumer<> Mid-Tier <> DataSource --or-- GUI <> Mid-Tier 
<> Database

Now instead of using PyQt QSqlDatabase you write a simple python program 
that Opens a Database Connection (whatever that looks like), Sends a 
DataRequest(whatever that looks like), and then Closes the Database

Now the ResultSet you got from your DataRequest is simply convert into a 
python Dictionary and shipped off to the Mid-Tier which passes it on to 
whatever front-end(s) that need to consume it

Frankly it is that simple -- absolutely no need to use a table model or 
any such thing as that just greatly over complicates what you are doing 
-- and by not doing so we are letting the database handle that part -- 
and assuming that database was designed properly their should be no 
issue there -- aka it designed datacentric

On 6/9/2020 12:27 PM, Barry Scott wrote:
>
>> On 9 Jun 2020, at 12:16, Nenad Lamza <nenad.lamza at sk.t-com.hr> wrote:
>>
>> Dennis,
>>
>> I must be honest and admit I couldn't understand a word you were talking about.
>>
>> Are you suggesting me to use psycopg2 or something else instead of standard PyQt QSqlDatabase, QSqlQuery, QSqlQueryModel,... And as I understand you suggest that I use MVC without QSqlQueryModel and QTableView. How, to take a few years off and make my own MVC?
>
> I think he is saying that you could use tools like SqlAlchemy or psycopg2 for the Postgresql side of things and feed the business logic objects from your DB access code into your GUI.
>
> Raw access to the SQL output is not that useful in many apps that have Sql backends as they have to work in end-user concepts not tables.
>
> Also I think he is saying using PyQt5 Sql is harder to get going because of the driver problem.
>
> Barry
>
>
>> Nenad
>>
>>
>>> ------------------------------
>>>
>>> Message: 2
>>> Date: Mon, 8 Jun 2020 09:21:15 -0500
>>> From: Dennis Jensen <djensen at pgcontrols.com>
>>> To: pyqt at riverbankcomputing.com
>>> Subject: Re: What is the right way to use PostgreSQL with PyQt5
>>> Message-ID: <02fea112-efe9-ce6f-ec39-b4988435eab7 at pgcontrols.com>
>>> Content-Type: text/plain; charset="utf-8"; Format="flowed"
>>>
>>> First and foremost using the PyQt database tools is completely
>>> unnecessary and is either at the least adding much more complexity than
>>> needed and at worst it is tying the front-end way to tightly to the
>>> back-end which is just full numerous issues.  However, on a positive
>>> note you can interface with PostgresSQL and any other database software
>>> using straight Python allowing one to build an interface to the database
>>> that they can connect to the GUI via a Data-Router (or Controller) thus
>>> in 90% or more of the cases where you are dealing with a GUI and a data
>>> source (be it a database or something else that supplies data) the MVC
>>> or (M-C/R-V) methodology is generally the best method to apply as it
>>> keeps things very simple and straight forward and you can later easily
>>> add and/or change either the front-end and/or back-end without any
>>> issues and these kind of changes do happen more often than one might
>>> suspect.  Next it also removes or at least reduces the issues you might
>>> be having with drivers because once you get the PostresSQL up and
>>> running you do not need anything more than the Python library to
>>> interface with it.
>>>
>>> On 6/7/2020 12:02 PM, Nenad Lamza wrote:
>>>> I use PostgreSQL 9.6.17 (installed on linux server on LAN) and have
>>>> Win10 (or Win7) clients with installed Python 3.7 or 3.8 and PyQt
>>>> 5.13.2, and my PyQt5 app that uses that PostgreSQL server works ok,
>>>> but I really don't know what I'm doing.
>>>>
>>>> I'll describe the problem. If I don't have PostgreSQL installed on Win
>>>> client (I don't need it because I use PostgreSQL on linux server) or
>>>> have installed it but not in path, my app crashes with the error:
>>>> "QSqlDatabase: QPSQL driver not loaded".
>>>>
>>>> So, I need some drivers. And I install PostgreSQL 9.6.x on Win client
>>>> and have it in path and after that everything works ok, but only if I
>>>> had luck and picked the right x in PostgreSQL 9.6.x version.
>>>>
>>>> The alternative is that I don't install PostgreSQL 9.6.x (why would I
>>>> need to install it) on client machine and just copy some dll files at
>>>> the app directory. If I find the right files (drivers), everything
>>>> works ok, but if I don't, the app crashes with the error:
>>>> "QSqlDatabase: QPSQL driver not loaded" or worse, recognize the
>>>> PostgreSQL database on server, works ok some time, but after the
>>>> first, second or third query it crashes.
>>>>
>>>> Some driver combinations I copy to my app directory that work with
>>>> PyQt 5.13.2:
>>>>
>>>> 1.
>>>> Timestamp                      Size             File
>>>> 25/02/2016  07:19         1,015,973 libiconv-2.dll
>>>> 07/01/2016  09:02         1,550,023 libintl-8.dll
>>>> 10/07/2019  20:20           145,408 libpq.dll
>>>>
>>>> 2.
>>>> Timestamp                      Size             File
>>>> 21/06/2019  14:43         1,218,048 libeay32.dll
>>>> 25/02/2016  07:19         1,015,973 libiconv-2.dll
>>>> 07/01/2016  09:02         1,550,023 libintl-8.dll
>>>> 10/07/2019  20:20           145,408 libpq.dll
>>>> 21/06/2019  14:43           276,992 ssleay32.dll
>>>>
>>>> If I install PyQt 5.14 or 5.15 (instead of PyQt 5.13.2), the app
>>>> crashes, and I am afraid to upgrade PyQt5.
>>>>
>>>> So, my question is:
>>>> How do I know which drivers I should copy to my app directory with
>>>> various version of PyQt5, that's the mistery to me. And also if
>>>> copying the drivers to my app directory is the right way at all?
>>>>
>>>> There's a fine answer here:
>>>>
>>>> https://stackoverflow.com/questions/20884010/qt5-failed-to-load-psql-driver-in-windows
>>>>
>>>> "It's quite likely to be failing because there's a dependency of
>>>> |qsqlpsql.dll| missing - either |libpq.dll|, or one of the libraries
>>>> that |libpq| build requires." ... "You should use the /same/ libpq
>>>> your Qt's |qsqlpgsql.dll| was compiled against if possible."
>>>>
>>>> If that's true, how should I know with what libpq library
>>>> qsqlpgsql.dll was compiled in. I suppose PyQt 5.13.2's qsqlpgsql.dll
>>>> is compiled with different version than PyQt 5.14.x's qsqlpgsql.dll or
>>>> even 5.15.x's qsqlpgsql.dll.
>>>>
>>>> Also, this link has some clues:
>>>> https://stackoverflow.com/questions/26507353/qpsql-driver-not-loaded-qt
>>>>
>>>> And generally, what's the best way to work with PostgreSQL in PyQt5.
>>>> It obviously doesn't work out of the box if PostgreSQL is not
>>>> installed on client machine, and even if the wrong version is installed.
>>>>
>>>> Nenad
>>>>


More information about the PyQt mailing list