(1)、数据库(database)是按照数据结构来组织、存储和管理数据的建立在计算机存储设备上的仓库。简单来说是本身可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据进行新增、截取、更新、删除等操作。
(2)、数据库是长期储存在计算机内、有组织的、可共享的数据集合。数据库中的数据指的是以一定的数据模型组织、描述和储存在一起、具有尽可能小的冗余度、较高的数据独立性和易扩展性的特点并可在一定范围内为多个用户共享。
总结以上两点,数据库在物理层面上是一个存储数据的仓库,在逻辑层面上是可长期存储的数据的集合,在数据库上的操作就是对数据的增删查改。我现在问个问题,把所有的数据都不加区分的一股脑全放进数据库中可以吗?当然不行,根据数据类型的不同,数据库分为不同的数据表,而每个数据表又包含一到多条数据项。我们对数据库的操作,其实就是对数据表和数据项的操作。
ok,枯燥的基础知识就介绍到这儿,感兴趣的朋友可以自己买本书好好学一学,数据库本身就是一个大学科,够我们好多年学了,因此,在这儿就不多赘述了,我们重点探讨python中数据库的操作。下面进入到python“数据库操作”第一站——sqlite的学习使用。
sqlite是一个轻量级的关系型数据库,它小巧快捷,运行占用资源非常低,能够支持windows/linux/unix等等主流的操作系统,在需要数据库的小型桌面软件和手机软件中应用最为广泛,目前几个知名的手机操作系统(比如android、windows mobile、symbian等),sqlite都支持得非常好。python标准库中的sqlite3为我们提供了操作sqlite的接口,使用前通过import导入即可,如下图所示。
要操作数据库,大致需要以下几个步骤:首先要连接到数据库;连接到数据库后,需要打开游标cursor;通过游执行sql语句,获得执行结果;当完成所有操作后,需要关闭数据库连接。ok,我们依次学习一下在python中如何实现这些步骤。
一、连接数据库
连接数据库用到了connect方法,参数就是数据库所在的路径,当数据库不存在时,自动创建,sqlite数据库的后缀名为db。
conn是何许人也,我们问一下help。
原来通过connect方法连接数据库后生成一个connection对象,表示sqlite的数据库连接,connection对象有许多属性方法,后续会经常用到。下图时执行完connect方法后,我电脑中生成的test.db文件,证实了方法的有效性。
二、打开游标
打开游标用到了connection对象的cursor方法,那么什么是游标呢,不要着急,我们先执行代码看看。
通过help语句,我们知道了游标就是一个cursor对象,cursor对象中有许多方法,如下图所示。
仔细分析一下,就能发现,这些方法无外乎两大类,一是执行sql语句,二是获取执行结果。这样一来,游标的作用也就明了了,我们可以把游标理解为一个指针,它可以定位执行结果中的任何位置,也允许用户对指定位置的数据进行处理。
三、创建数据表
我们之前也提到过,对数据库的操作其实是对数据表和表中数据项的操作,test.db是一个空数据库,我们有必要先创建一个数据表,如下图所示是文档中给出的例子,我们分析分析。
创建数据表的sql语法是:
sql语句可以写在一行,也可以写在多行,写在多行的时候建议使用三引号''',如上述代码所示,看起来比较直观。就上述代码而言,stocks就是表名;date、trans、symbol、qty、price就是字段,即数据表中每一列的标识;text、real就是各个字段的数据类型。
执行sql语句,需要使用cursor对象的execute方法,参数就是sql语句。
四、执行增删查改操作
(1)增,即向数据表中插入数据项(即记录)。
“增”的sql语法是:
需要注意的是value1、value2等要与创建数据表时设置的数据类型相一致。同样使用cursor对象的execute方法执行sql语句,然后调用connection对象的commit方法保存对数据库的修改。上述代码中采用try/except写的原因是确保当执行sql语句发生错误时,错误信息能够被及时捕捉到,方便于后续的程序调试。
如果你想一次性插入n条记录,当然可以执行n次execute方法,不过还有更简单的,即采用 executemany方法。
上述代码中的连续5个问号是什么意思呢?文档中有这样一句话,大家看看put ? as a placeholder wherever you want to use a value, and then provide a tuple of values as the second argument to the cursor.execute() method。意思就是:我们可以在sql语句中想要使用value的地方放一个问号“?”作为占位符,然后传递一个包含value的元祖作为execute方法的第二个参数。这样做使得sql语句更加灵活,不必写死,而可以根据我们的需要随时变化。
有一些朋友会问了,我不想那样写,我想使用str对象的format方法或%实现上述功能,我告诉你,在sql语句中千万不要这样写,如果你不想遭受sql注入攻击的话。
(2)删,即删除数据表中的某条记录。
“删”的sql语法是:
上述代码也可以这样写,或者说更提倡使用下面的写法:
(3)查,即按照条件查询返回数据表中的相关记录。
上述sql语句表示不加限制的返回数据表中的所有记录,我们也可以如同删除语句那样加上where限制条件,如下图所示。
上述代码中列出查询结果,所采用的方法是cursor对象的fetchall方法,表示取出所有的查询记录。除此之外,sqlite3还提供了以下两个方法,fetchmany方法用于取出多条查询记录,fetchone方法用于取出一条查询记录。需要注意的是执行完查询语句后禁止执行commit方法,因为查询并没有造成数据库的改变。
ok,忘了一点,“查”的sql语法是:
(4)改,即按照条件更改数据表中的现有记录。
“改”的sql语法是:
where语句其实就是条件选择语句,用于确定需要更新的记录。补充一下,上述代码中漏写了commit语句,大家自己写的时候要注意执行增删改语句导致数据库发生改变时都要执行commit方法提交更改。下面我们用查询语句,看看更新结果如何。
五、关闭游标
关闭游标用到了cursor对象的close方法。数据库操作完成后,关闭游标,释放资源,是一个比较好的习惯,大家在自己写代码的时候要注意。
六、关闭数据库连接
关闭数据库连接用到了connection对象的close方法,我们需要注意的是要先关闭游标,再关闭数据库连接。
ok,今天的讲解就到这儿,相信大家对数据库的操作已经有了初步的认识,sql语句不会写没关系,在后续的讲解中,我也会带着大家多多熟悉sql语句的语法。最后,感谢大家的关注与阅读,还有更多的精彩美文会陆陆续续呈现给大家,敬请享用吧!