Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Cannot connect to databases, Driver not loaded error.



  • Hello everyone, this is yet another post on the dreaded error when trying to connect to a database from Qt, but a bit different.

    I am on an up-to-date Debian testing with Qt installed to /opt from the online installer.
    I am trying to write a program that connects to a database but the connection fails with error "Driver not loaded". Now, I've seen a lot of similar discussions but I wish to point out that this one is different from the ones that I've seen so far. In particular, I used to have the "regular" error due to a linking issue in libqsqlmysql.so but then I followed instruction online, recompiled it an substituted the original file.
    After that, the error message that I get changed and now my code, which reads

    db.addDatabase("QMYSQL");
    db.setDatabaseName("SomeDatabase");
    if (not db.open())
    {
        qDebug() << db.lastError().text();
    }
    

    simply prints

    "Driver not loaded Driver not loaded"
    

    I thought it was a problem with MySQL so I tried to connect to an SQLite database but to my surprise I got the same error message, meaning that there's something wrong elsewhere.

    Since I'm on Debian, I thought I would try again using Qt from Debian's repositories, so I installed all the missing development packages, added a Qt toolkit to QtCreator and tried again: same error.

    I know that the database is working because I also have a PyQt5 [again from Debian's repositories] application that connects to a similar database by just

    db = QSqlDatabase.addDatabase("QMYSQL")
    db.setDatabaseName("SomeDatabase")
    

    and it works.

    What can I try next? Any clue is welcome.


  • Qt Champions 2019

    I still think the sql plugin has some issues. Take a look what http://doc.qt.io/qt-5/qsqldatabase.html#drivers is telling you and make sure libqsqlmysql.so finds all it's dependencies (e.g. with ldd)


  • Lifetime Qt Champion

    Hi and welcome to devnet,

    To add to @Christian-Ehrlicher, this question has been asked many times already on this forum, please take the time to search through it.



  • Hi Christian, SGaist, thank you for your answers. As I mentioned in my post, I have already searched thoroughly the net for a solution, I have already re-compiled libqsqlmysql.so and calling ldd on it shows that not only does it not miss any dependency, it also links to the same libraries as the homonymous file from Debian's repositories. In particular, it links to the installed version of libmariadbclient [Debian switched to MariaDB which is a fork of MySQL and a drop-in replacement].

    In any case, I also mentioned in my previous post that the problem is not specific to the MySQL driver, but I get the same error even if I try to use SQLite as a backend.

    What is the next thing that I can try?


  • Lifetime Qt Champion

    Then start your application with the QT_DEBUG_PLUGINS environment variable set to 1. That will give you some more information about what is happening.



  • Thanks for the suggestion!
    This is the relevant output

    QFactoryLoader::QFactoryLoader() checking directory path "/opt/Qt/5.10.1/gcc_64/plugins/sqldrivers" ...
    QFactoryLoader::QFactoryLoader() looking at "/opt/Qt/5.10.1/gcc_64/plugins/sqldrivers/libqsqlite.so"
    Found metadata in lib /opt/Qt/5.10.1/gcc_64/plugins/sqldrivers/libqsqlite.so, metadata=
    {
        "IID": "org.qt-project.Qt.QSqlDriverFactoryInterface",
        "MetaData": {
            "Keys": [
                "QSQLITE"
            ]
        },
        "className": "QSQLiteDriverPlugin",
        "debug": false,
        "version": 330241
    }
    
    
    Got keys from plugin meta data ("QSQLITE")
    QFactoryLoader::QFactoryLoader() looking at "/opt/Qt/5.10.1/gcc_64/plugins/sqldrivers/libqsqlmysql.so"
    Found metadata in lib /opt/Qt/5.10.1/gcc_64/plugins/sqldrivers/libqsqlmysql.so, metadata=
    {
        "IID": "org.qt-project.Qt.QSqlDriverFactoryInterface",
        "MetaData": {
            "Keys": [
                "QMYSQL3",
                "QMYSQL"
            ]
        },
        "className": "QMYSQLDriverPlugin",
        "debug": false,
        "version": 330241
    }
    
    
    Got keys from plugin meta data ("QMYSQL3", "QMYSQL")
    
    
    loaded library "/opt/Qt/5.10.1/gcc_64/plugins/sqldrivers/libqsqlmysql.so"
    "Driver not loaded Driver not loaded"
    

    Meanwhile I have run the Qt example sqlbrowser and it does successfully connect to my MySQL local server, it shows me the database and the tables. This makes me suspect that there is an error in the code, but what could it be?


  • Lifetime Qt Champion

    Debug VS Release version of the plugin ?



  • Sorry, I don't understand the question :(
    Are you asking me to compare two different builds of the same plugin?


  • Lifetime Qt Champion

    Did you build your plugin for both debug and release ?



  • need dynamic lib for mysql. For linux it's libmysqlclient.so.16 or libmysqlclient.so.18 for your target platform.



  • @SGaist I built just one, with the default configuration. I will check which one when I get back to my home pc. What difference does it make? Could it work with one but not the other one?

    @Homer2000 I am using a shared library, except my distribution [like many others] now uses MariaDB as a replacement for MySQL, so I link to libmariadb.so or something similar



  • @mleoni said in Cannot connect to databases, Driver not loaded error.:

    MariaDB

    MariaDB use libqsqlmysql plugin?


  • Lifetime Qt Champion

    @Homer2000 No, by default the Qt MySQL plugin links against the MySQL client libraries.

    You can build it to use MariaDB though.



  • Ok, I found out what I was doing wrong.
    The code that I was using is

    QSqlDatabase db;
    db.addDatabase("QMYSQL");
    

    and it was giving me the error above, whereas the correct way to do it is

    QSqlDatabase db;
    db = QSqlDatabase::addDatabase("QMYSQL");
    

    and with this code it works fine.

    I don't know why this is the case, I guess today I just learnt something new on Qt, thanks for the help everyboody!


  • Qt Champions 2019

    @mleoni said in Cannot connect to databases, Driver not loaded error.:

    I don't know why this is the case,

    Because QSqlDatabase::addDatabase() is a static function - no Qt magic here.



  • I see, so my mistake was letting the returned value go lost. Thanks for clarifying this!


  • Lifetime Qt Champion

    Please take the time to read the QSqlDatabase documentation. It shows how to use it properly.



  • Thanks for the reference!


Log in to reply