python sqlite操作

之前讲了一下python下mysql的操作,原文见

http://blog.csdn.net/ivan_zgj/article/details/50988552

今天就讲一下sqlite的操作吧,其实基本跟mysql是一样的。

首先,看下面的sqlite表:

嗯...这就是今天的示例代码要用到的表。下面看看示例代码:

import sqlite3

conn = sqlite3.connect('test.db3')
cur = conn.cursor()
cur.execute('select name,age,email,website from user_tb')
for row in cur.fetchall():
	print row
cur.close()
conn.close()
连接数据库很简单,直接调用sqlite3的connect接口,提供数据库的路径就可以了。如果我们要对其进行读写操作,就需要获得conn对象的cursor对象,这是一个游标,可以对数据库进行读写操作,进行读操作的时候,它会保存读取的结果并提供接口给调用者获取结果集。如上例代码所示。

cursor对象有以下一些常见的获取读取结果的方法和属性:

fetchall()

fetchone()

rowcount

等等。

这里要说明一点东西,也给mysql部分http://blog.csdn.net/ivan_zgj/article/details/50988552补充一下。fetchone()方法获取一行结果地同时,也会让cursor游标在结果集上下移一步。什么意思呢?假设结果集有5行,cursor现在在第一行,执行了fetchone之后,会返回第一行的数据,然后cursor就会下移到了第二行。此后如果再执行fetchone方法,就会返回第二行的数据,cursor继续往下移一行...如此类推,直到结果集被遍历完毕。同理,如果执行了fetchall,那么cursor的位置以后的结果集全部输出(不包括前面的)。也就是说,如果cursor现在在第三行,执行了fetchall,就只会输出3~5行,而1~2行不会输出。

我们实验一下:

import sqlite3

conn = sqlite3.connect('test.db3')
cur = conn.cursor()
cur.execute('select name,age,email,website from user_tb')
print cur.fetchone()
print cur.fetchone()
print '------------------'
for row in cur.fetchall():
	print row
cur.close()
conn.close()
输出结果如下:


---------------------------------------------------------------------我是可爱的分割线--------------------------------------------------------------------------


下面再来讲一下事务。其实跟mysql也是一样的。直接上代码。

import sqlite3

conn = sqlite3.connect('test.db3')
cur = conn.cursor()

print '----------before insert-----------'
cur.execute('select name,age,email,website from user_tb')
for row in cur.fetchall():
	print row


try:
	cur.execute(r"insert into user_tb (name,age,email,website)values('insert1',22,'23343212.com','127.0.01')")
	cur.execute(r"insert into user_tb (name,age,email,website)values('insert2',22,'23343212.com','127.0.01')")
	cur.execute(r"insert into user_tb (name,age,email,website)values('insert3',22,'23343212.com','127.0.01')")
	conn.commit()
except Exception as e:
	print e
	conn.rollback()
finally:
	cur.close()
	conn.close()

 
这是一个典型的实务操作流程。可以看到,事务操作是依赖于commit和rollback这两个方法的。roolback方法可以将数据库状态回滚到上一次commit成功的时候。我们可以测试一下: 

import sqlite3

conn = sqlite3.connect('test.db3')
cur = conn.cursor()

print '----------before insert-----------'
cur.execute('select name,age,email,website from user_tb')
for row in cur.fetchall():
	print row


try:
	cur.execute(r"insert into user_tb (name,age,email,website)values('insert1',22,'23343212.com','127.0.01')")
	cur.execute(r"insert into user_tb (name,age,email,website)values('insert2',22,'23343212.com','127.0.01')")
	cur.execute(r"insert into user_tb (name,age,email,website)values('insert3',22,'23343212.com','127.0.01')")
        conn.commit()
	
        print '---------after insert-----------'
	cur.execute('select name,age,email,website from user_tb')
	for row in cur.fetchall():
		print row
except Exception as e:
	print e
	conn.rollback()
finally:
	conn.rollback()
	print '---------after rollback-----------'
	cur.execute('select name,age,email,website from user_tb')
	for row in cur.fetchall():
		print row


cur.close()
conn.close()
上述代码,我们先给user_tb插入3条数据,然后在finally块中调用rollback方法,将操作回滚。我们可以看到打印结果如下:

我们可以看到,insert之后rollback之前,数据的确是已经成功插入到了user_tb中的,但是在我们执行了rollback之后,数据就还原到insert之前的状态了!这就是rollback的神奇之处!

当我们在执行一系列相关的数据库写操作时,可以使用事务来保证数据库数据的准确性。当这一系列写操作都能成功执行的时候,调用commit方法提交事务,当有一个失败的时候,调用rollback将前面的成功操作也一并撤销,保证了数据库数据的准确性!事务操作一般和try-except-finally操作使用的。


---------------------------------------------------------------------我是英俊的分割线-----------------------------------------------------------------------------


嗯...sqlite的基本操作就讲到这里吧。对于一般的自动化测试也已经够了。毕竟python只是我的兴趣而已o(╯□╰)o,有空用来写个爬虫爬爬东西,写个脚本把qq和微信里的数据导出来保存一下也够了。。当然也可以做点小小的恶作剧(邪恶的眼神O(∩_∩)O哈哈哈~)。。。嗯...今天就先这样吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值