python使用sqlite

前言

python通过sqlite3模块来操作sqlite。sqlite3是python的一个标准库并不需要安装,sqlite3是一个SQLite数据库DB-API2.0接口模块。

建立连接

要想使用这个模块,必须先创建一个Connection对象, 它代表数据库。

import sqlite3 
conn = sqlite3.connect('example.db')

上面的例子中,数据将存储在example.db文件中,如果文件存在则打开文件,如果文件不存在将新建一个example.db数据库文件,你也可以通过sqlite3.connect(":memory:")来创建一个内存中的数据库,通常情况下这没啥意义。

connect函数详解

函数签名:

sqlite3.connect(database[,timeout,detect_types,isolation_level,check_same_thread,factory,cached_statements,uri])

  • database: 准备打开的数据库文件的路径,也可以用":memory:"在内存中打开一个数据库。
  • timeout: 当一个数据库被多个连接访问的时候,如果其中一个进程修改这个数据库,在这个连接的事务提交之前,这个数据库将被一直锁定,timeout参数指定了等待锁定释放的超时时间,超过之后会引发一个异常,默认为5s
  • detect_types:默认是0,即关闭类型检测。SQLite原生支持5种类型:TEXT INTEGER REAL BLOB和NULL,如果想要用其他类型必须自行添加相应的支持,使用该参数和模块级别的register_converter()函数注册转换器来简单实现。该参数可能值还包括:
    • sqlite3.PARSE_DECLTYPES:设置为这个常量后,sqlite3模块将解析它返回的每一列的声明类型,比如integer primary key,它会解析出integer,如果是number(10)他会解析出number。然后,他会在装换器字典里查找那个类型注册的装换器函数,并调用它。
    • sqlite3.PARSE_COLNAMES:设置为这个常量后,sqlite接口将解析它放回的每一列的列名,会在其中查找 [mytype] 这个形式的字符串,然后用‘mytype’来决定那个列的类型。它会尝试在转换器字典中查找‘mytype’键对应的转换器函数,然后用这个转换器函数返回的值来做为列的类型。
  • isolation_level:用于设置sqlite3模块中事务控制的行为
  • check_same_thread:默认情况下为True,只有当前的线程可以使用该连接。如果设置为False,则多个线程可以共享放回的连接。当多个线程使用同一个连接的时候,用户应该把写操作序列化,以避免数据损坏。
  • factory:connect是一个工厂函数,默认情况下使用了sqlite3模块中它自己的Connection类,你也通过继承Connection类来创建自己的连接类,然后将其赋值给factory来使用。
  • cached_statements:sqlite3模块在内部使用语句缓存来避免SQL解析开销,默认情况下缓存100条语句

其返回的是一个Connection对象。

使用连接

当有了一个Connection对象后,你就可以创建Cursor游标对象,通过游标对象你就可以对整个数据库进行增删改查了。

c = conn.cursor()
c.execute('''CREATE TABLE stocks
             (date text, trans text, symbol text, qty real, price real)''')
c.execute("INSERT INTO stocks VALUES ('2006-01-05','BUY','RHAT',100,35.14)")
conn.commit()
conn.close()

让我们来逐一解释上面的语句:

  • conn.cursor(): 调用Connection对象的cursor()函数,放回一个cursor对象
  • c.execte():该方法用于执行SQL语句
  • conn.commit():用于提交当前事务,如果没有调用这个方法,那么从上一次执行commit()以来的所有的变化其他该数据连接上都是不可见的。
  • conn.close():关闭数据库连接, 注意他并不会自动调用commit()方法,如果在关闭数据库连接之前没有调用commit()那么你的修改将会丢失。

我们通常的使用流程就是这样的。

Connection对象

属性:

  • isolation_level:获取或设置当前默认的隔离级别
  • in_transaction:这是一个只读属性,如果是在活动事务中(即数据库发生了改变但是还没有commit时)返回True,一旦你commit后返回False。
  • cursor():返回一个Cursor对象
  • commit():提交当前事务,如果没有调用这个方法,那么从上一次提交commit()以来所有的变化在其他数据库连接中不可见
  • rollback():回滚从上一次调用commit()以来所有数据库的改变
  • close():关闭数据库连接,注意它不会自动调用commit()方法,如果在关闭之间没有调用commit()那么修改将会丢失
  • execute(sql):这是一个非标准的快捷方法, 它会调用cursor()方法来创建Cursor对象,并且用给定的参数来调用Cursor对象的execute()方法,最后返回的是这个游标对象。
  • executemany():这也是一个非标准的快捷方法,对应Cursor对象的executemany()方法
  • executescript():同上,对应Cursor对象的executescript()方法

Cursor对象

  • execute(sql):执行SQL语句,可以参数化SQL语句,sqlite3模块支持两种占用符:问号和命名占用符。需要注意的是,该方法一次仅仅能执行一条SQL语句,如果想要执行多条语句请使用executescript()方法
In [1]: import sqlite3
In [2]: con = sqlite3.connect('example.db')
In [3]: data = '2018-01-08'
In [4]: trans = 'BUY'
In [5]: symbol = 'RHAT'
In [6]: qty = '120'
In [7]: price = '12.1'
In [8]: cur = con.cursor()
In [9]: cur.execute('insert into stocks values (?,?,?,?,?)',(data,trans,symbol,qty,price))
Out[9]: <sqlite3.Cursor at 0x233f51c1e30>
In [10]: con.commit()
In [16]: cur.execute('select * from stocks where date=:data and trans=:buy',{'data':data,'buy':trans})
Out[16]: <sqlite3.Cursor at 0x233f51c1e30>
In [17]: print(cur.fetchone())
('2018-01-08', 'BUY', 'RHAT', 120.0, 12.1)
  • executescript(sql_script):一次执行多个SQL语句的快捷方法
  • fetchone():获取查询结果集的下一行,返回单个序列,如果没有更多数据可用,则返回None
  • fetchall():获取查询结果集的所有(剩余)行,并返回一个列表。
In [18]: cur.execute('select * from stocks')
Out[18]: <sqlite3.Cursor at 0x233f51c1e30>
In [19]: cur.fetchone()
Out[19]: ('2006-01-05', 'BUY', 'RHAT', 100.0, 35.14)
In [20]: cur.fetchone()
Out[20]: ('2006-01-05', 'BUY', 'CHE', 200.0, 1.2)
In [21]: cur.fetchone()
Out[21]: ('2018-01-08', 'BUY', 'RHAT', 120.0, 12.1)
In [22]: cur.fetchone()
In [23]: cur.execute('select * from stocks')
Out[23]: <sqlite3.Cursor at 0x233f51c1e30>
In [24]: cur.fetchone()
Out[24]: ('2006-01-05', 'BUY', 'RHAT', 100.0, 35.14)
In [25]: cur.fetchall()
Out[25]:
[('2006-01-05', 'BUY', 'CHE', 200.0, 1.2),
 ('2018-01-08', 'BUY', 'RHAT', 120.0, 12.1)]
  • close():关闭这个Cursor对象

SQLite与python类型

SQLite原生支持一下类型:NULL INTEGER REAL TEXT BLOB
这五种类型对应于python中的None int float str bytes,也就是说将这些类型发送给SQLite不会出现任何问题。而且sqlite3模块默认也是这么转换的。

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

推荐阅读更多精彩内容