PyQt5编程(35)—使用数据库(1)

PyQt5包括不需要安装任何额外Python库,就可用于操作SQLite,MySQL,Oracle,PostgreSQL和其他的数据库的工具。
1.连接数据库
QSqlDatabase类负责连接数据库和处理事务。 要建立与数据库的连接,必须调用此类的静态addDatabase()方法。其格式为:
addDatabase (QString type, QString connectionName ='')
addDatabase (QSqlDriver driver, QString connectionName ='')
type的类型及含义如下:

类型 描述
QDB2 IBM DB2
QIBASE Borland InterBase驱动程序
QMYSQL MySQL驱动程序
QOCI Oracle调用接口驱动程序
QODBC ODBC驱动程序(包括Microsoft SQL Server)
QPSQL PostgreSQL驱动程序
QSQLITE SQLite版本3或以上
QSQLITE2 SQLite版本2
QTDS Sybase Adaptive Server
connectionName为连接的名称。

addDatabase()方法返回一个QSqlDatabase类的实例,它表示建立连接的数据库。 QSqlDatabase方法有(详见http://doc.qt.io/qt-5/qsqldatabase.html):

setHostName(QString host):设置数据库的主机。
setPort(int port):设置连接数据库的主机商品。
setDatabaseName(QString name): 设置数据库名称、目录(sqlite数据库)或连接串(ODBC);
setUserName(QString name): 设置访问数据库的用户名;
setPassword(QString name): 设置访问数据库对应用户名的密码;
setConnectOptions(QString options = ''):该函数要在连接打开之前调用。对不同数据库可设的参数值请参考(http://pyqt.sourceforge.net/Docs/PyQt4/qsqldatabase.html#setConnectOptions)
open() 或open(QString user, QString password) :打开数据库,如果成功返回True,否则返回False.

注意!
在创建到数据库的连接之前,应该创建一个应用程序对象(QApplication对象的一个实例)。 如果没有这样做,PyQt将无法下载指定数据库格式的驱动程序,也不会创建连接。
要打开的数据库必须已经存在于磁盘或服务器上。 唯一的例外是SQLite数据库,如果打开时不存在,将动自动创建。

isOpen():如果数据库已打开,返回True;否则,返回False。
isOpenError(): 如果打开数据库连接时发生错误,返回True; 否则返回False。 可以使用lastError()读取错误信息。
transaction(): 在数据库上开始一个事务。 如果操作成功,则返回true。 否则,它返回false。
commits(): 如果驱动程序支持事务并且transaction()已经启动,则向数据库提交事务。 如果操作成功,则返回true。 否则,返回false。
rollback():如果驱动程序支持事务并且transaction()已经启动,则向数据库提出取消事务。 如果操作成功,则返回true。 否则,返回false。
lastError():返回QSqlError实例,为数据库时发生的最后一个错误的信息。
connectionName():返回数据库连接信息。
tables ([QSql.TableType type = QSql.Tables]):返回数据库表list. type参数可为:
    QSql.Tables,0x01:所有用户表
    QSql.SystemTables,0x02:内部表
    QSql.Views,0x04:所表用户视图
    QSql.AllTables,0xff:用户表、内部表和用户视图
record ( QString tablename):返回一个 QSqlRecord 实例,包含表名为tablename的表结构。
primaryIndex(): 返回一个 QSqlIndex 实例,包含表名为tablename的主索引。
close():关闭数据库连接。

除了addDatabase()静态方法外,QSqlDatabase类还有以下静态方法:

 contains (QString connectionName = '']):如果数据库连接列表包含connectionName,则返回true; 否则返回false。
 connectionNames(): 返回包含所有连接名称的列表。
database (QString connectionName = '', bool open = True):返回名为connectionName的数据库连接。 数据库连接必须是已经用addDatabase()添加的连接。 如果参数open为True(默认),并且数据库连接尚未打开,则调用此函数时会打开。 如果没有指定connectionName,则使用默认连接。 如果connectionName在数据库列表中不存在,则返回无效的连接。
 cloneDatabase (QSqlDatabase other, QString connectionName):克隆other数据库连接,连接名为connectionName。  
removeDatabase(QString connectionName):从数据库连接列表中删除connectionName数据库连接。
isDriverAvailable(QString name):name驱动存在,返回True;否则,返回False.
drivers():返回所有可用数据库驱动程序的列表。

下面代码为连接各种数据库并打开的操作:

from PyQt5 import QtWidgets, QtSql
import sys
#创建一个应用程序对象,否则数据库支持将不起作用
app = QtWidgets.QApplication(sys.argv)

#打开SQLite数据库
con1 = QtSql.QSqlDatabase.addDatabase('QSQLITE')
con1.setDatabaseName('c://work//data.sqlite')
con1.open()
con1.close()

#打开MySQL数据库
con2 = QtSql.QSqlDatabase.addDatabase('QMYSQL')
con2.setHostName(“somehost”);
con2.setDatabaseName(“somedb”);
con2.setUserName(“someuser”);
con2.setPassword(“password”);
con2.open();
con2.close()

#通过ODBC打开Access数据库
con3 = QtSql.QSqlDatabase.addDatabase(“QODBC”);
con3.setDatabaseName(“DRIVER = {Microsoft Access Driver(* .mdb)};
FIL = {MS Access}; DBQ = c:/work/data.mdb“);
con3.open()
con3.close()

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • sqlmap用户手册 说明:本文为转载,对原文中一些明显的拼写错误进行修正,并标注对自己有用的信息。 ======...
    wind_飘阅读 2,025评论 0 5
  • http://192.168.136.131/sqlmap/mysql/get_int.php?id=1 当给sq...
    xuningbo阅读 10,240评论 2 22
  • 需要原文的可以留下邮箱我给你发,这里的文章少了很多图,懒得网上粘啦 1数据库基础 1.1数据库定义 1)数据库(D...
    极简纯粹_阅读 7,397评论 0 46
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,392评论 25 707
  • 把一切枷锁都打碎吧 自由的风 别让那纤夫的绳索 深深勒进你的肩膀 引燃坟墓里的野草吧 放出死者的灵魂 看一看他们的...
    寒斋书郎阅读 247评论 0 5