QSQLITE附加数据库挂起的原因可能是什么

2024-09-29 17:19:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我在一次非常罕见的失败中挣扎。我运行了一个程序,将配置数据库连接到生产数据库。我使用了来自sqliteATTACH DATABASE命令。它工作得很好,我对这个解决方案感到高兴。从一次运行到另一次运行,它停止连接。如果我在Sqlviewer的环境中使用,我可以打开第一个DB并运行类似ATTACH DATABASE 'c:\DATEN\temp\clcconfig.db' as 'configdb'的SQL语句,然后我可以看到所有表。 封闭的snipped包含我在运行时使用的命令。我在Windows101909下使用PyQt5.15.1和Python3.7

我不知道这怎么会发生。任何人都可以使用任何数据库测试附带的代码

from PyQt5.QtSql import QSqlDatabase, QSqlQuery
import os


maindb = 'C:/DATEN/temp/Test20.db'
confdb = 'c:/DATEN/temp/clcconfig.db'

if os.path.exists(maindb):
    print("maindb exists")
if os.path.exists(confdb):
    print("confdb exists")

db = QSqlDatabase.addDatabase ("QSQLITE")
db.setDatabaseName (maindb)
if db.open ():
    print ("Main DB open")

print ("DB driver     :", db.drivers ())
print ("DB Names      :", db.databaseName ())
print ("db Connections:", db.connectionNames ())
print ("db Tables     :", db.tables ())

sql = "ATTACH DATABASE '%s' AS %s"%(confdb,'configdb')
qry = QSqlQuery (db)
qry.exec_ (sql)
print ("sqlexec fault:", qry.lastError ().text ())

print ("DB Names      :", db.databaseName ())
print ("db Connections:", db.connectionNames ())
print ("db Tables     :", db.tables ())

print ("DB Error      :", db.lastError ().databaseText ())
print ("driver Error  :", db.lastError ().driverText ())

Tags: 数据库dbifosexiststempdatabaseprint
1条回答
网友
1楼 · 发布于 2024-09-29 17:19:17

tables()方法仅返回主数据库的sqlite_master的表,因此无法获取附加表的名称。如果要从连接的数据库获取表,则必须使用SQL查询:

import os
import sys

from PyQt5.QtSql import QSqlDatabase, QSqlQuery


maindb = "C:/DATEN/temp/Test20.db"
confdb = "C:/DATEN/temp/clcconfig.db"

if os.path.exists(maindb):
    print("maindb exists")
if os.path.exists(confdb):
    print("confdb exists")

db = QSqlDatabase.addDatabase("QSQLITE")
db.setDatabaseName(maindb)
if not db.open():
    print(db.lastError().text())
    sys.exit(-1)

print("Main DB open")

qry = QSqlQuery(db)
qry.prepare("ATTACH ? AS ?")
for path, name in ((confdb, "configdb"),):
    qry.addBindValue(path)
    qry.addBindValue(name)
    if not qry.exec_():
        print(qry.lastError().text())
        sys.exit(-1)

databases = []
qry = QSqlQuery("PRAGMA database_list", db)
if not qry.exec_():
    print(qry.lastError().text())
    sys.exit(-1)

rec = qry.record()
i = rec.indexOf("name")
while qry.next():
    databases.append(qry.value(i))

tables = []

for database in databases:
    qry = QSqlQuery(
        "SELECT name FROM %s.sqlite_master WHERE type='table'" % (database,), db
    )
    if not qry.exec_():
        print(qry.lastError().text())
    while qry.next():
        tables.append(qry.value(0))
print(tables)

相关问题 更多 >

    热门问题