Форум программистов, компьютерный форум, киберфорум
Python: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
13 / 10 / 5
Регистрация: 11.10.2019
Сообщений: 290

Параллельное соединение базы

02.09.2020, 09:59. Показов 886. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброе утро. Правильно ли использую соединение?

Python
1
2
3
4
5
6
7
8
9
10
11
какой то код
SOED1 = QT_DB_OPEN( file1 )    
SOED2 = QT_DB_OPEN( file2 )
 
А дальше в любых местах просто пишу
q1 = QtSql.QSqlQuery( SOED1 )
...
q2 = QtSql.QSqlQuery( SOED2 )
...
q2 = QtSql.QSqlQuery( SOED2 )
...
Это параллельное соединение? Или оно последнее соединение подхватило и держит только ее?

Сама соединение например
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
def QT_DB_OPEN( basename0 ):
    
    db = QtSql.QSqlDatabase.addDatabase('QSQLITE')
    #db = sqlite3.connect( basename0 )
    db.setDatabaseName( basename0 )
 
    db.open()
 
    if db.open() == False:
        YNC('Ошибка соединения c базой!')
        print( db.lastError().text() )
    elif 0: pass
    
    return db
Добавлено через 5 минут
И еще не помешало бы узнать проверку соединения,вернее как узнать к какой базе подключен? Чтобы как раз и узнать параллельное или нет соединение.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.09.2020, 09:59
Ответы с готовыми решениями:

RC параллельное соединение
При подаче постоянного напряжения ток первым делом потечет на конденсатор, т.к. его сопротивление очень мало, со временем сопротивление на...

Последовательное и параллельное соединение
Как изменится ток источника при увеличении сопротивления R3. Решить в общем виде.

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

16
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
02.09.2020, 09:59
Параллельное соединение - вроде, из электрических цепей термин.
Каждое соединение (connection) будет держатся, пока не закроете - нет оснований его закрывать.
elif 0: pass не имеет смысла.
1
13 / 10 / 5
Регистрация: 11.10.2019
Сообщений: 290
02.09.2020, 10:06  [ТС]
dondublon, Просто чую что в каких то местах оно у меня не параллельное. Вот и хочу проверить.Как проверить?
Например вот:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
text_zapros = "SELECT * FROM "+sprav_rash_r
q1 = QtSql.QSqlQuery( SOED1 )                    #scan_cl_obnov.db
q1.exec(text_zapros)
 
if q1.isActive():
     q1.first()
     while q1.isValid():
             получаю какие-нибудь значения для вставки во второй запрос для другой базы
             q2 = QtSql.QSqlQuery( SOED2 )       #scan_cl.db
             text_zapros2='бла бла '
             q2.exec(text_zapros2)
             if q2.isActive():
                q2.first()
                if q2.isValid() != True:
                    q2.exec("INSERT INTO "+sprav_rash_r+" VALUES ("+itog_str+")")                
                elif 0: pass
            elif 0: pass
            q1.next()
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
02.09.2020, 10:10
Что вы понимаете под "параллельным"? Что если вы будете делать запросы к соединением попеременно, они будут работать? Будут.
Или что долгие запросы можно запустить одновременно? Это уже нет.
1
13 / 10 / 5
Регистрация: 11.10.2019
Сообщений: 290
02.09.2020, 11:15  [ТС]
dondublon, Вопрос решен.Тему закрываем. У меня было пару ошибок. Теперь все ок с соединениями и запросами.
0
13 / 10 / 5
Регистрация: 11.10.2019
Сообщений: 290
02.09.2020, 20:26  [ТС]
dondublon, Да проверил последовательное соединение.То есть перед каждый запросом новое соединение ставить приходится. То есть по очереди делаю соединение в две базы,чередую то есть. Вот и получается в одной функции по несколько раз подключаться приходится,где то 5 раз в одну базу и 5 раз в другую базу. Плохо что не параллельное,вернее одновременно два подключения к базе хотел сделать, но с разным именем.

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
text_zapros = "SELECT * FROM "+sprav_rash_r
SOED1 = QT_DB_OPEN( file1 )                       #Соединение
q1 = QtSql.QSqlQuery( SOED1 )                    #scan_cl_obnov.db
q1.exec(text_zapros)
 
if q1.isActive():
     q1.first()
     while q1.isValid():
             получаю какие-нибудь значения для вставки во второй запрос для другой базы
             SOED2 = QT_DB_OPEN( file2 )          #соединение
             q2 = QtSql.QSqlQuery( SOED2 )       #scan_cl.db
             text_zapros2='бла бла '
             q2.exec(text_zapros2)
             if q2.isActive():
                q2.first()
                if q2.isValid() != True:
                    q2.exec("INSERT INTO "+sprav_rash_r+" VALUES ("+itog_str+")")                
                elif 0: pass
            elif 0: pass
            q1.next()
 
Дальше опять
text_zapros = "SELECT * FROM "+sprav_ptih
SOED1 = QT_DB_OPEN( file1 )                       #Соединение
q1 = QtSql.QSqlQuery( SOED1 )                    #scan_cl_obnov.db
q1.exec(text_zapros)
 
if q1.isActive():
     q1.first()
     while q1.isValid():
             получаю какие-нибудь значения для вставки во второй запрос для другой базы
             SOED2 = QT_DB_OPEN( file2 )          #соединение
             q2 = QtSql.QSqlQuery( SOED2 )       #scan_cl.db
             text_zapros2='бла бла '
             q2.exec(text_zapros2)
             if q2.isActive():
                q2.first()
                if q2.isValid() != True:
                    q2.exec("INSERT INTO "+sprav_prih+" VALUES ("+itog_str+")")                
                elif 0: pass
            elif 0: pass
            q1.next()
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
02.09.2020, 20:31
Сергей225, ну а несколько запросов по одному соединению не работают?
0
13 / 10 / 5
Регистрация: 11.10.2019
Сообщений: 290
02.09.2020, 23:31  [ТС]
dondublon, По одному то соединению работают несколько запросов это понятно. Мне нужно из одной базы достать данные и проверить их в другой базе. Таких несколько кусков.Приходится каждый раз соединение делать. 10 поди соединений пишу в разных местах в одной функции. Соединились с одной базой,достал значения и вставил в запрос для соединения с другой базой. Потом опять все повторяется. Просто несколько таблиц.
0
13 / 10 / 5
Регистрация: 11.10.2019
Сообщений: 290
03.09.2020, 09:18  [ТС]
dondublon, Не понятно как работает соединение

Попробую примерно так:

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
text_zapros = "SELECT * FROM "+sprav_prih
SOED1 = QT_DB_OPEN( file1 )
q1 = QtSql.QSqlQuery( SOED1 )
q1.exec(text_zapros)
    
if q1.isActive():
        q1.first()        
        while q1.isValid():
            itog_str = "'"+str(q1.value('regp'))+"','"+str(q1.value('dtoh'))+\
                    "','"+str(q1.value('nnmt'))+"','"+str(q1.value('nser'))+\
                    "','"+str(q1.value('anal'))+"','"+str(q1.value('kolf'))+\
                    "','"+str(q1.value('naim'))+"','"+str(q1.value('mehr'))+"'"
            
            test()
 
            #чтобы вернуться к предыдущему соединению.Цикл продолжается а соединение уже закрыто,так как мы открывали его в test() SOED2          
            SOED1 = QT_DB_OPEN( file1 )       
            
            q1.next()
 
 
def test(): #<=понятно что пердать параметры надо сюда
 
SOED2 = QT_DB_OPEN( file2 )                   #<--------другое соединение с другой базой
q2 = QtSql.QSqlQuery( SOED2 )       #scan_cl.db
text_zapros2 = "SELECT * FROM "+sprav_prih+\
                           " WHERE regp='"+str(q1.value('regp'))+\
                           "' and dtoh='"+str(q1.value('dtoh'))+\
                           "' and nnmt='"+str(q1.value('nnmt'))+\
                           "' and nser='"+str(q1.value('nser'))+\
                           "' and anal='"+str(q1.value('anal'))+"'"
q2.exec(text_zapros2)            
#Проверим есть ли эта запись.
if q2.isActive():
        q2.first()                
        if q2.isValid() != True:
              q2.exec("INSERT INTO "+sprav_prih+" VALUES ("+itog_str+")")                
        elif 0: pass
elif 0: pass
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
03.09.2020, 11:27
Сергей225, непонятно, что вам непонятно.
Соединение соответствует базе. К базе по одному соединению можно делать много запросов. Два разных соединения никак не дожны мешать друг другу. Если у вас что-то не работает - подтвердите это и укажите на возникающую ошибку.

Добавлено через 1 минуту
Да, и не надо вторично создавать соединения. И закрывать его тоже. Закрывайте только тогда, когда оно уже не нужно.
0
13 / 10 / 5
Регистрация: 11.10.2019
Сообщений: 290
03.09.2020, 11:51  [ТС]
dondublon, Ну смотрите.Делаю проверку print(SOED1.open()) и print(SOED2.open()) какой то из них будет True а какой то False. Если цикл продолжается,а соединение то уже закрыто,вот и открываю снова соединение для первой базы.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SOED1 = QT_DB_OPEN( file1 ) 
q1 = QtSql.QSqlQuery( SOED1 )
q1.exec(text_zapros)
...
Цикл(while q1.isValid()): #это для SOED1 в цикл заходит
       SOED2 = QT_DB_OPEN( file2 )
       print(SOED1.open())             #<======False
       print(SOED2.open())             #<======True
       q2 = QtSql.QSqlQuery( SOED2 )
       q2.exec(какой-то запрос)
       #Сделали что-то
 
       SOED1 = QT_DB_OPEN( file1 ) #Снова соединяю чтобы было True,а то по логике получается что цикл не сработает дальше,так как соединение закрыто 
       print(SOED1.open())             #<======True
       print(SOED2.open())             #<======False
       q1.next()
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
03.09.2020, 13:01
Насколько я понимаю, open() открывает базу, а не возвращает статус. Тогда было бы opened. Но это надо проверить.
Повторяю: попробуйте запросы, должны работать. И соединение со второй базой вынестите из цикла.
0
13 / 10 / 5
Регистрация: 11.10.2019
Сообщений: 290
03.09.2020, 14:11  [ТС]
dondublon, Скорее isOpen() поди. А разве print() не для сообщаловки? То есть он может выполнить что-то еще внутри print,странно?

В самом начале функции пишу.
Python
1
2
3
4
SOED1 = QT_DB_OPEN( 'basa1.db' )    
SOED2 = QT_DB_OPEN( 'basa2.db' )
print(SOED1.isOpen())         #<===false
print(SOED2.isOpen())         #<===true
Все никак не могу добиться.Должно быть у обоих true.

Добавлено через 4 минуты
А вот функция соединения

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
def QT_DB_OPEN( basename0 ):
    
    db = QtSql.QSqlDatabase.addDatabase('QSQLITE')
    #db = sqlite3.connect( basename0 )
    db.setDatabaseName( basename0 )
 
    db.open()
 
    if db.open() == False:
        YNC('Ошибка соединения c базой!')
        print( db.lastError().text() )
    elif 0: pass
    
    return db
Добавлено через 17 минут
Я сейчас даже отдельный чистый файл создал для теста. Все равно false и true.


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
from PyQt5 import QtWidgets, QtCore, QtGui, QtSql
import os
 
class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, *args):
        QtWidgets.QMainWindow.__init__(self)
     
        SOED1 = QT_DB_OPEN( 'basa1.db' )    
        SOED2 = QT_DB_OPEN( 'basa2.db' )
        print(SOED1.isOpen())                   #<===false
        print(SOED2.isOpen())                   #<===true
#=======================================================
#СОЕДИНЕНИЕ С БАЗОЙ SQLITE
           
def QT_DB_OPEN( basename0 ):
    
    db = QtSql.QSqlDatabase.addDatabase('QSQLITE')
    #db = sqlite3.connect( basename0 )
    db.setDatabaseName( basename0 )
 
    db.open()
 
    if db.open() == False:
        YNC('Ошибка соединения c базой!')
        print( db.lastError().text() )
    elif 0: pass
    
    return db
 
#=======================================================
if __name__ == '__main__':  
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = MainWindow()
    window.show()   
    sys.exit( app.exec_() )
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
03.09.2020, 14:36
Сергей225, внутри print() он выполняет open(), как вы и пишете. Точнее, пытается выполнить. Возможно, он не может открыть то, что уже открыто.
Может, и isOpen() - у меня ваших объектов нет.
В функции соединения, кстати, вы дважды вызываете open().
Цитата Сообщение от Сергей225 Посмотреть сообщение
Все никак не могу добиться.Должно быть у обоих true.
Я вам выше неоднократно писал, что надо проверить, работают ли запросы. Вместо этого вы упёрлись в open(). Больше писать не буду.
0
13 / 10 / 5
Регистрация: 11.10.2019
Сообщений: 290
03.09.2020, 16:03  [ТС]
dondublon, Вот пожалуйста с запросом. Знаю что нет таблицы такой в первой базе. Соответственно вывод подтвердился на счет последовательного соединения.

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
from PyQt5 import QtWidgets, QtCore, QtGui, QtSql
import os
import sqlite3
 
class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, *args):
        QtWidgets.QMainWindow.__init__(self)
        SOED1 = QT_DB_OPEN( 'scan_cl_obnov.db' )    
        SOED2 = QT_DB_OPEN( 'scan_cl.db' )
        
        print(SOED1.isOpen())               #<===false
        print(SOED2.isOpen())               #<===true
 
        text_zapros = "SELECT * FROM qr_prih"     #<========== этой таблицы нету в базе scan_cl_obnov.db,но он выполнился для другой базы
        q1 = QtSql.QSqlQuery( SOED1 )
        q1.exec(text_zapros)
        if q1.isActive():
            q1.first()        
            while q1.isValid():
                print(q1.value('qr_kod'))
                q1.next()    
        
#=======================================================
#СОЕДИНЕНИЕ С БАЗОЙ SQLITE
           
def QT_DB_OPEN( basename0 ):
    
    db = QtSql.QSqlDatabase.addDatabase('QSQLITE')
    #db = sqlite3.connect( basename0 )
    db.setDatabaseName( basename0 )
 
    db.open()
 
    if db.open() == False:
        YNC('Ошибка соединения c базой!')
        print( db.lastError().text() )
    elif 0: pass
    
    return db
 
#=======================================================
if __name__ == '__main__':  
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = MainWindow()
    window.show()   
    sys.exit( app.exec_() )
Добавлено через 16 минут
Если закомментирую SOED2 то все правильно и ничего не выдаст,так как нет таблицы этой в первой базе. Буду дальше думать как одновременно два соединения сделать.
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
03.09.2020, 16:22
Если запрос выдаёт что-то типа "table not found" - значит, запрос работает, и соединение тоже работает.
0
13 / 10 / 5
Регистрация: 11.10.2019
Сообщений: 290
03.09.2020, 17:01  [ТС]
dondublon, Ура нашел решение. Теперь обе true. И запросы нормально заработали. Ну теперь осталось доработать мою функцию соединения с доп параметром con1 и con2. Спасибо dondublon что не остался в стороне. Все закрываем тему. Все из за этого con1 и con2.

Python
1
2
3
4
5
6
7
8
9
10
11
12
item_data = QtSql.QSqlDatabase.addDatabase('QSQLITE', 'con1')
item_data.setDatabaseName('scan_cl_obnov.db')
item_data.open()
         
item_data2 = QtSql.QSqlDatabase.addDatabase('QSQLITE', 'con2')
item_data2.setDatabaseName('scan_cl.db')
item_data2.open()
         
#query = QtSql.QSqlQuery()  # объект запроса
 
print(item_data.open())        #<===true
print(item_data2.open())      #<===true
Добавлено через 36 секунд
Вот новый вариант рабочий,вдруг кому пригодится.

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
from PyQt5 import QtWidgets, QtCore, QtGui, QtSql
import os
import sqlite3
 
class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, *args):
        QtWidgets.QMainWindow.__init__(self)
        SOED1 = QT_DB_OPEN( 'scan_cl_obnov.db', 'con1' )    
        SOED2 = QT_DB_OPEN( 'scan_cl.db', 'con2' )
 
        print(SOED1.isOpen())               #<===true
        print(SOED2.isOpen())               #<===true
 
#=======================================================
#СОЕДИНЕНИЕ С БАЗОЙ SQLITE
           
def QT_DB_OPEN( basename0, con0 ):
    
    db = QtSql.QSqlDatabase.addDatabase('QSQLITE', con0)
    #db = sqlite3.connect( basename0 )
    db.setDatabaseName( basename0 )
 
    db.open()
 
    if db.open() == False:
        YNC('Ошибка соединения c базой!')
        print( db.lastError().text() )
    elif 0: pass
    
    return db
 
#=======================================================
if __name__ == '__main__':  
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = MainWindow()
    window.show()   
    sys.exit( app.exec_() )
Добавлено через 23 минуты
И да забыл еще сказать. Это будет работать где реально несколько соединений будет. Для одного соединения с одной базой не прокатит,там без con. То есть сделайте библиотечку себе для двух разных соединений. Функция для одной и функция для нескольких соединений. Может и не прав. В любом случае тестируйте.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.09.2020, 17:01
Помогаю со студенческими работами здесь

Параллельное соединение проводников
Сила тока в проводнике убывает от 5 А до 0 в течение 10 с линейно со временем. Напряжение в цепи постоянно и равно 12 В. Какое количество...

Параллельное соединение аккумуляторов
Всем привет, начинающий самоучка, так что пинайте не сильно). В общем стоит вопрос параллельного соединения аккумуляторов. Вопрос в...

Параллельное соединение проводников
Дано: R_1= 5 Ом, R_2= 25 Ом, R_3= 160 Ом, R_4= 25 Ом, R_5= 70 Ом, R_6= 30 Ом, V_1= 32 В Найти: показания всех приборов Показания...

Параллельное соединение проводников
Помогите пожалуйста!!! Очень прошу!!! Я полный 0 в физике!!! Условие и схема вложил

Параллельное соединение проводников
Пожалуйста помогите Сила тока в проводнике убывает от 5 А до 0 в течение 10 с линейно со временем. Напряжение в цепи постоянно и равно 12...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru