- class QSqlDatabase#
QSqlDatabase类处理数据库连接。 更多…摘要#
方法#
def
__init__()def
close()def
commit()def
connectOptions()def
connectionName()def
databaseName()def
driver()定义
driverName()定义
exec()定义
exec_()定义
hostName()定义
isOpen()定义
isValid()定义
lastError()定义
open()定义
password()定义
port()定义
record()定义
rollback()定义
setPort()定义
tables()
静态函数#
注意
本文档可能包含自动从C++翻译到Python的代码段。我们始终欢迎对代码段的翻译做出贡献。如果您发现翻译存在问题,也可以通过在https:/bugreports.qt.io/projects/PYSIDE上创建工单的方式告诉我们。
详细描述#
警告
本节包含自动从C++翻译到Python的代码段,可能包含错误。
QSqlDatabase类提供了一个通过连接访问数据库的接口。一个QSqlDatabase的实例表示连接。连接通过支持的一种数据库驱动程序提供对数据库的访问,这些驱动程序是从QSqlDriver派生的。或者,您也可以从QSqlDriver派生您自己的数据库驱动程序。有关更多信息,请参阅如何编写自己的数据库驱动程序。通过调用静态函数
addDatabase()之一创建一个连接(即QSqlDatabase的实例),其中指定所需的驱动程序或驱动程序类型(根据数据库类型而定)以及连接名称。连接以其自己的名称而闻名,而非与之连接的数据库的名称。您可以对一个数据库拥有多个连接。QSqlDatabase还支持 默认 连接的概念,即无名称的连接。要创建默认连接,在调用addDatabase()时不要传递连接名称参数。之后,如果调用任何不指定连接名称的静态成员函数,则假定默认连接。以下示例代码展示了如何创建并打开到 PostgreSQL 数据库的默认连接db = QSqlDatabase.addDatabase("QPSQL") db.setHostName("acidalia") db.setDatabaseName("customdb") db.setUserName("mojito") db.setPassword("J0a1m8") ok = db.open()
创建
QSqlDatabase对象之后,使用setDatabaseName()、setUserName()、setPassword()、setHostName()、setPort()和setConnectOptions()设置连接参数。然后调用open()来激活到数据库的物理连接。在打开之前,该连接是不可用的。上述定义的连接将是 默认 连接,因为我们没有给
addDatabase()提供连接名称。之后,您可以通过调用database()而不带连接名称参数来获取默认连接db = QSqlDatabase.database()
QSqlDatabase是一个值类。通过一个QSqlDatabase实例对数据库连接所做的更改,将影响表示相同连接的其他QSqlDatabase实例。使用cloneDatabase()可根据现有的连接创建一个独立的数据库连接。警告
强建议您不要将
QSqlDatabase作为类的成员保留副本,因为这将阻止在关闭时正确清理实例。如果您需要访问现有的QSqlDatabase,请使用database()方法进行访问。如果您选择有一个QSqlDatabase成员变量,则在删除 QCoreApplication 实例之前必须将其删除,否则可能导致未定义的行为。如果您创建了多个数据库连接,请在调用
addDatabase()时为每个连接指定一个唯一的连接名称。使用带有连接名称的database()获取该连接。使用带有连接名称的removeDatabase()移除一个连接。如果尝试移除由其他QSqlDatabase对象引用的连接,QSqlDatabase会输出警告。使用contains()查看给定的连接名称是否在连接列表中。一些实用方法
返回表列表
返回表的主索引
返回关于表字段的元信息
开始一个事务
保存并完成事务
取消事务
hasFeature()
检查驱动程序是否支持事务
返回有关上次错误的信息
返回可用的 SQL 驱动程序名称
检查特定驱动程序是否可用
注册自定义驱动程序
- PySide6.QtSql.QSqlDatabase.defaultConnection#
- __init__(driver)#
- 参数:
driver –
QSqlDriver
这是一个重载函数。
使用给定的
driver创建数据库连接。- __init__()
创建一个空的、无效的
QSqlDatabase对象。使用addDatabase()、removeDatabase()和database()获取有效QSqlDatabase对象。- __init__(type)
- 参数:
类型 – str
这是一个重载函数。
创建一个使用由
type指定的驱动器的QSqlDatabase连接。如果无法识别type,则数据库连接将没有任何功能。当前可用的驱动类型包括
驱动程序类型
描述
QDB2
IBM DB2
QIBASE
Borland InterBase 驱动程序
QMYSQL
MySQL 驱动程序
QOCI
Oracle 调用接口驱动程序
QODBC
ODBC 驱动程序(包括 Microsoft SQL Server)
QPSQL
PostgreSQL 驱动程序
QSQLITE
SQLite 3 或以上版本
QMIMER
Mimer SQL 11 或以上版本
可以动态加载额外的第三方驱动程序,包括您自己的自定义驱动程序。
- __init__(other)
- 参数:
其他 –
QSqlDatabase
创建一个
other的副本。- 静态addDatabase(driver[, connectionName=QLatin1StringView(QSqlDatabase.defaultConnection)])#
- 参数:
driver –
QSqlDriverconnectionName – 字符串
- 返回类型:
警告
本节包含自动从C++翻译到Python的代码段,可能包含错误。
此重载在有需要使用您自己实例化的
driver创建数据库连接时非常有用。这可能是一个您自己的数据库驱动程序,或者您可能只需要实例化一个Qt驱动程序。如果这样做,建议将驱动程序代码包含到您应用程序中。例如,您可以使用自己的QPSQL驱动程序创建PostgreSQL连接,如下所示con = PQconnectdb("host=server user=bart password=simpson dbname=springfield") drv = QPSQLDriver(con) db = QSqlDatabase.addDatabase(drv) # becomes the default() connection() query = QSqlQuery() query.exec("SELECT NAME, ID FROM STAFF")
上述代码设置PostgreSQL连接并实例化一个QPSQLDriver对象。接下来,调用
addDatabase()增加连接到已知连接中,以便它可以使用Qt SQL类。当使用连接句柄(或句柄集)实例化驱动程序时,Qt假设您已经打开了数据库连接。注意
我们假设
qtdir是Qt的安装目录。这将包含使用PostgreSQL客户端库和实例化QPSQLDriver对象所需的代码,假设您在包含搜索路径中有PostgreSQL头文件。请记住,您必须将应用程序链接到数据库客户端库。确保客户端库位于链接器的搜索路径中,并将以下行添加到您的
.pro文件中unix:LIBS += -lpq win32:LIBS += libpqdll.lib
描述的该方法适用于所有提供的驱动程序。唯一的区别将在于驱动程序构造函数参数。以下是Qt包含的驱动程序及其源代码文件和构造函数参数的表
驱动程序
类名
构造函数参数
包含的文件
QPSQL
QPSQLDriver
PGconn *connection
qsql_psql.cppQMYSQL
QMYSQLDriver
MYSQL *connection
qsql_mysql.cppQOCI
QOCIDriver
OCIEnv *environment, OCISvcCtx *serviceContext
qsql_oci.cppQODBC
QODBCDriver
SQLHANDLE environment, SQLHANDLE connection
qsql_odbc.cppQDB2
QDB2
SQLHANDLE environment, SQLHANDLE connection
qsql_db2.cppQSQLITE
QSQLiteDriver
sqlite *connection
qsql_sqlite.cppQMIMER
QMimerSQLDriver
MimerSession *connection
qsql_mimer.cppQIBASE
QIBaseDriver
isc_db_handle connection
qsql_ibase.cpp警告
使用与现有连接相同的连接名称添加数据库连接,会替换现有连接。
- 静态addDatabase(type[, connectionName=QLatin1StringView(QSqlDatabase.defaultConnection)])
- 参数:
类型 – str
connectionName – 字符串
- 返回类型:
使用驱动类型
type和连接名称connectionName将数据库添加到数据库连接列表中。如果已存在名为connectionName的数据库连接,则该连接将被移除。数据库连接通过
connectionName来引用。返回刚添加的数据库连接。如果
type不可用或无法加载,isValid()将返回false。如果未指定
connectionName,新连接将成为应用程序的默认连接。后续调用database()而不提供连接名称参数时,将返回默认连接。如果在这里提供了connectionName,则使用database(connectionName)来获取连接。警告
如果您添加了一个与现有连接同名的连接,新连接将替换旧连接。如果您在未指定
connectionName的情况下多次调用此函数,则默认连接将被替换。在使用连接之前,必须对其进行初始化。例如,调用以下方法之一或所有:
setDatabaseName()、setUserName()、setPassword()、setHostName()、setPort()、setConnectOptions(),最后调用open()。参考
database()removeDatabase()多线程 和 SQL 模块- staticcloneDatabase(other, connectionName)#
- 参数:
其他 –
QSqlDatabaseconnectionName – 字符串
- 返回类型:
将数据库连接
other克隆并存储为connectionName。从原始数据库中所有设置,如databaseName(),hostName()等,都将被复制。如果other是一个无效数据库,则不执行任何操作。返回新创建的数据库连接。注意
新的连接尚未打开。在使用新连接之前,必须调用
open()。- static cloneDatabase(other, connectionName)
- 参数:
other – str
connectionName – 字符串
- 返回类型:
这是一个重载函数。
将数据库连接
other克隆并存储为connectionName。从原始数据库中所有设置,如databaseName(),hostName()等,都将被复制。如果other是一个无效数据库,则不执行任何操作。返回新创建的数据库连接。注意
新的连接尚未打开。在使用新连接之前,必须调用
open()。此重载在将数据库克隆到由
other表示的数据库使用的线程时很有用。- close()#
关闭数据库连接,释放任何获取的资源,并使所有与数据库一起使用的现有
QSqlQuery对象无效。这也将影响此
QSqlDatabase对象的副本。- commit()#
- 返回类型:
bool
如果驱动程序支持事务并且已启动
transaction(),则将事务提交到数据库。如果操作成功,则返回true。否则返回false。注意
对于某些数据库,如果有使用数据库的
SELECT的活动查询,提交将失败并返回false。在进行提交之前,请使查询变为非活动状态。调用
lastError()来获取错误信息。- connectOptions()#
- 返回类型:
str
返回用于此连接的连接选项字符串。该字符串可能为空。
- connectionName()#
- 返回类型:
str
返回连接名称,可能为空。
- 静态 connectionNames(#
- 返回类型:
字符串列表
返回包含所有连接名称的列表。
参考
contains()database()线程和SQL模块- 静态 contains([connectionName=QLatin1StringView(QSqlDatabase.defaultConnection)])#
- 参数:
connectionName – 字符串
- 返回类型:
bool
如果数据库连接列表包含指定的
connectionName,则返回true;否则返回false。参考
connectionNames()database()线程和SQL模块- 静态 database([connectionName=QLatin1StringView(QSqlDatabase.defaultConnection)[, open=true]])#
- 参数:
connectionName – 字符串
open – bool
- 返回类型:
返回名为
connectionName的数据库连接。必须已经使用addDatabase()添加数据库连接。如果open为 true(默认值)且数据库连接尚未打开,则立即打开它。如果未指定任何connectionName,则使用默认连接。如果connectionName不在数据库列表中,则返回无效连接。参考
isOpen()线程 和 SQL 模块- databaseName()#
- 返回类型:
str
返回连接的数据库名称,可能为空。
- driver()#
- 返回类型:
返回用于访问数据库连接的数据库驱动程序。
- driverName()#
- 返回类型:
str
返回连接的驱动程序名称。
- 静态 drivers()#
- 返回类型:
字符串列表
返回所有可用数据库驱动程序的列表。
在数据库上执行SQL语句并返回一个
QSqlQuery对象。请使用lastError()来检索错误信息。如果query为空,则返回一个空且无效的查询,且不会影响lastError()。请使用
exec()代替。- hostName()#
- 返回类型:
str
返回连接的主机名;它可能为空。
- 静态 isDriverAvailable(name)#
- 参数:
name – 字符串
- 返回类型:
bool
如果存在名为
name的驱动器,则返回true;否则返回false。参考
- isOpen()#
- 返回类型:
bool
如果数据库连接当前是打开的,则返回
true;否则返回false。- isOpenError()#
- 返回类型:
bool
如果打开数据库连接时发生错误,则返回
true;否则返回false。可以使用lastError()函数获取错误信息。- isValid()#
- 返回类型:
bool
警告
本节包含自动从C++翻译到Python的代码段,可能包含错误。
如果
QSqlDatabase有有效的驱动器,则返回true。示例
db = QSqlDatabase() print(db.isValid() ) # Returns false db = QSqlDatabase.database("sales") print(db.isValid() # Returns \c true if "sales" connection exists) QSqlDatabase.removeDatabase("sales") print(db.isValid() ) # Returns false
返回数据库最后发生错误的详细信息。
与单个查询一起发生的失败将由
lastError()报告。返回数据库连接当前的默认精度策略。
- open()#
- 返回类型:
bool
使用当前连接值打开数据库连接。成功时返回
true;否则返回false。可以使用lastError()获取错误信息。- open(user, password)
- 参数:
user – str
password – str
- 返回类型:
bool
这是一个重载函数。
使用给定的用户名和密码打开数据库连接。成功时返回
true;否则返回false。可以使用lastError()函数获取错误信息。此函数不会存储给定的密码。相反,该密码将直接传递给驱动程序以打开连接,然后将其丢弃。
参考
- password()#
- 返回类型:
str
返回连接的密码。如果使用
setPassword()设置了密码,则返回空字符串;如果调用open()时提供了密码,或者未使用密码。- port()#
- 返回类型:
int
返回连接的端口号。如果未设置端口号,则该值未定义。
参考
返回表
tablename的主索引。如果不存在主索引,则返回一个空的QSqlIndex。注意
某些驱动程序,如 QPSQL 驱动程序,可能需要您以小写形式传递
tablename,如果创建表时未引号。有关更多信息,请参阅 Qt SQL驱动程序 文档。- record(tablename)#
- 参数:
tablename – str
- 返回类型:
返回一个填充了表(或视图)
tablename中所有字段名称的QSqlRecord对象。字段在记录中出现的顺序是未定义的。如果不存在这样的表(或视图),则返回空记录。注意
某些驱动程序,如 QPSQL 驱动程序,可能需要您以小写形式传递
tablename,如果创建表时未引号。有关更多信息,请参阅 Qt SQL驱动程序 文档。- static registerSqlDriver(name, creator)#
- 参数:
name – 字符串
creator –
QSqlDriverCreatorBase
警告
本节包含自动从C++翻译到Python的代码段,可能包含错误。
此函数在SQL框架内部注册名为
name的新SQL驱动程序。如果您有一个自定义SQL驱动程序且不希望将其作为插件编译,这将很有用。示例
QSqlDatabase.registerSqlDriver("MYDRIVER", QSqlDriverCreator()<QSqlDriver>) QVERIFY(QSqlDatabase.drivers().contains("MYDRIVER")) db = QSqlDatabase.addDatabase("MYDRIVER") QVERIFY(db.isValid())
QSqlDatabase将拥有creator指针的所有权,因此您不能自己删除它。参考
- static removeDatabase(connectionName)#
- 参数:
connectionName – 字符串
警告
本节包含自动从C++翻译到Python的代码段,可能包含错误。
从数据库连接列表中删除数据库连接
connectionName。警告
在调用此函数时应在数据库连接上没有打开的查询,否则会发生资源泄露。
示例
# WRONG db = QSqlDatabase.database("sales") query = QSqlQuery("SELECT NAME, DOB FROM EMPLOYEES", db) QSqlDatabase.removeDatabase("sales") # will output a warning # "db" is now a dangling invalid database connection, # "query" contains an invalid result set
正确的方法
db = QSqlDatabase.database("sales") query = QSqlQuery("SELECT NAME, DOB FROM EMPLOYEES", db) # Both "db" and "query" are destroyed because they are out of scope QSqlDatabase.removeDatabase("sales") # correct
要删除默认连接(可能是在调用未指定连接名称的
addDatabase()方法时创建的),可以通过调用在database()方法返回的数据库上的connectionName()来检索默认连接名称。注意,如果尚未创建默认数据库,则将返回一个无效的数据库。参考
database()connectionName()线程和SQL模块- rollback()#
- 返回类型:
bool
如果驱动程序支持事务且已开始一次
transaction(),则将撤销数据库上的事务。如果操作成功,则返回true,否则返回false。注意
对于某些数据库,如果在数据库上存在使用
SELECT的active query,则回滚操作可能会失败并返回false。在进行回滚之前,请使查询inactive。调用
lastError()来获取错误信息。- setConnectOptions([options=""])#
- 参数:
options - str
警告
本节包含自动从C++翻译到Python的代码段,可能包含错误。
设置特定于数据库的
options。这必须在连接打开之前完成,否则它将不起作用。另一种可能是关闭连接,调用QSqlDatabase::setConnectOptions(),然后再次open()连接。选项字符串的格式是由分号分隔的选项名称或选项=value 对的列表。选项取决于所使用的数据库客户端,并在 SQL 数据库驱动程序 页面中为每个插件进行描述。
示例
db.setConnectOptions("SSL_KEY=client-key.pemSSL_CERT=client-cert.pem;SSL_CA=ca-cert.pem;CLIENT_IGNORE_SPACE=1"); # use an SSL connection to the server if not db.open(): db.setConnectOptions() # clears the connect option string # ... # ... # PostgreSQL connection db.setConnectOptions("requiressl=1") # enable PostgreSQL SSL connections if not db.open(): db.setConnectOptions() # clear options # ... # ... # ODBC connection db.setConnectOptions("SQL_ATTR_ACCESS_MODE=SQL_MODE_READ_ONLYSQL_ATTR_TRACE=SQL_OPT_TRACE_ON"); # set ODBC options if not db.open(): db.setConnectOptions() # don't try to set this option # ...
有关不同的选项,请参阅客户端库文档。
- setDatabaseName(name)#
- 参数:
name – 字符串
警告
本节包含自动从C++翻译到Python的代码段,可能包含错误。
将连接的数据库名称设置为
name。为了生效,数据库名称必须在连接打开之前设置。或者,您也可以先关闭连接,设置数据库名称,然后再次调用open()。注意
数据库名称不是连接名称。连接名称必须在创建连接对象时传递到
addDatabase()。对于 QSQLITE 驱动程序,如果指定的数据库名称不存在,则会为您创建文件,除非设置了 QSQLITE_OPEN_READONLY 选项。
此外,
name可以设置为":memory:",这将创建一个临时数据库,该数据库仅在应用程序的生命周期内可用。对于 QOCI(Oracle)驱动程序,数据库名称是 TNS 服务名称。
对于 QODBC 驱动程序,
name可以是 DSN,DSN 文件名(在这种情况下,文件必须有.dsn扩展名),或连接字符串。例如,Microsoft Access 用户可以使用以下连接字符串直接打开一个
.mdb文件,而不必在 ODBC 管理器中创建 DSN 条目# ... db = QSqlDatabase.addDatabase("QODBC") db.setDatabaseName("DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};FIL={MS Access};DBQ=myaccessfile.mdb") if db.open(): # success! # ...
没有默认值。
- setHostName(host)#
- 参数:
host – str
将连接的主机名设置为
host。要生效,必须在连接被打开之前设置主机名。或者,您也可以通过close()关闭连接,设置主机名,然后再次调用open()。没有默认值。
- setNumericalPrecisionPolicy(precisionPolicy)#
- 参数:
precisionPolicy –
NumericalPrecisionPolicy
将在此数据库连接上创建的查询使用的默认数值精度策略设置为
precisionPolicy。注意:不支持以低精度获取数值的驱动程序将忽略精度策略。您可以使用
hasFeature()来确定是否支持此功能。注意:将默认精度策略设置为
precisionPolicy不会影响任何当前处于活动状态的查询。- setPassword(password)#
- 参数:
password – str
将连接的密码设置为
password。为了生效,必须在连接打开之前设置密码。或者,您可以关闭连接,设置密码,然后再次调用打开方法。没有默认值。
警告
这个函数将在 Qt 中以明文形式存储密码。为了避免这种行为,请使用带密码参数的
open()调用。- setPort(p)#
- 参数:
p – int
将连接的端口号设置为
port。为了生效,必须在连接打开之前设置端口号。或者,您可以关闭连接,设置端口号,然后再次调用打开方法。没有默认值。
- setUserName(name)#
- 参数:
name – 字符串
将该连接的用户名设置为
name。为使生效,用户名必须在连接被打开之前设置。或者,您可以先调用close()关闭连接,设置用户名,然后再调用open()。没有默认值。
返回数据库的表格(系统表格和视图),由参数
type指定。- transaction()#
- 返回类型:
bool
如果驱动程序支持事务,则在数据库上开始一个事务。如果操作成功,则返回
true。否则返回false。- userName()#
- 返回类型:
str
返回连接的用户名;它可能为空。