Qt Sql соединяется с несколькими базами данных - PullRequest
1 голос
/ 26 февраля 2020

У меня проблема с Python 3.7 PyQt5 Qt Sql. Я пытаюсь подключить несколько баз данных MS SQL, но не могу понять, как это сделать.

У меня есть следующая функция для подключения:

from PyQt5 import QtSql
def connectDb(database_name):
    SERVER_NAME = 'COMPUTER\\SQLEXPRESS'
    DATABASE_NAME = database_name
    connString = f'DRIVER={{SQL Server}};'\
                 f'SERVER={SERVER_NAME};'\
                 f'DATABASE={DATABASE_NAME}'
    db = QtSql.QSqlDatabase.addDatabase("QODBC")
    db.setDatabaseName(connString)
    if not db.open():
        print(db.lastError().text())
    return db

Для подключения к базе данных:

db1 = connectDb("Database1")
db2 = connectDb("Database2")

Однако при попытке подключения ко второй базе данных я получите сообщение:

QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' is still in use, all queries will cease to work.
QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.

Причина, по которой я хочу, чтобы несколько баз данных были открыты, заключается в том, что слишком медленно открывать и закрывать соединения с базой данных каждый раз, когда мне нужно запросить другую базу данных в моем коде. Я бы предпочел оставить их открытыми и закрыть при выходе из программы.

1 Ответ

3 голосов
/ 26 февраля 2020

Когда QSqlDataBase создается с использованием метода addDatabase(), имена, передаваемые через параметр connectionName, сохраняются в словаре, где ключ принимает это значение, если это параметр не передается, тогда используется «qt_sql_default_connection», в результате чего при создании Второй базы данных вы получаете дубликат в словаре, поэтому Qt выдает это предупреждение. Возможное решение - передать ему другое имя (не проверено):

from PyQt5 import QtSql


def connectDb(database_name, connection_name):
    SERVER_NAME = "COMPUTER\\SQLEXPRESS"
    DATABASE_NAME = database_name
    connString = (
        f"DRIVER={{SQL Server}};" f"SERVER={SERVER_NAME};" f"DATABASE={DATABASE_NAME}"
    )
    db = QtSql.QSqlDatabase.addDatabase("QSQLITE", <b>connection_name</b>)
    db.setDatabaseName(connString)
    if not db.open():
        print(db.lastError().text())
    return db
db1 = connectDb("Database1", "connection_1")
db2 = connectDb("Database2", "connection_2")
...