之前讲了一下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哈哈哈~)。。。嗯...今天就先这样吧。