前言
Python操作数据库大概会写这么几个主题: 用sql操作传统数据库, 用peewee(orm) 操作传统数据库, 用pymongo
操作mongodb, 用ming(pymongo的orm)操作mongodb. 网上关于mongodb的文章比较少,
且大部分都是解释一些玩具用法, 所以我打算在这个主题深入下.
至于sqlalchemy, 这个在django默认使用的orm, 可以看这篇文章, 作者写得很用心. python和sqlalchemy
这个系列的文章也不打算介绍sql. 如果你对sql一无所知, 建议一并学习python操作sql, 一边在这里查阅相关知识: sql语法
"安装数据库"
故意用了"安装"这个标题. 其实mysql才要安装, sqlite不用. 它默认是个文件, 在你创建之后就有了, 路径由你指定. 说了这么久"废话", 来点代码吧. 新建一个 sqlite_sql_1.py 文件, 输入以下内容:
大多数编程语言都是这样操作数据库的:
* 定义一个连接字符串: sqlite的连接字符串就是文件路径. 由于test.db很明显是个相对路径, 所以在运行这段代码之后, 你可以观察到这个文件所在的目录下多了个test.db文件.
* 获得连接: 连接是数据库编程的一个概念, 先获得连接才能进行其他操作.
* 获得游标: 从连接里再获得游标, 然后才可以操作.
* 执行sql语句: 用字符串定义sql语句, 然后作为游标的参数执行.
* 确认执行或回滚: 执行sql语句之后, 并不会真的将数据写到数据库. 必须用commit语句确认才行. 否则, 用回滚语法, 使执行无效. * 关闭连接: 关闭连接, 释放资源.
上述程序执行以后, 会在test.db这个数据库里创建一个表, 表名是 student, 字段有2个: 一个是name, 一个是int.
你会发觉如果再次运行程序会报错. 这是因为数据库不允许再次创建表. 如果是mysql数据库倒好办,
sqlite只能通过特殊点的代码去解决了.
解决重复创建表的问题
把这段程序保存为 sqlite_sql_2.py, 运行试试.
在25 - 34 行, 通过抓获异常来解决表是否重复的问题. 这是一个可行的思路.
插入数据
sql语句里, 用insert 语句进行插入. 看代码会更快. :-)
这个程序可以重复执行. 因为插入数据是没有限制的.
安装客户端查看数据
数据貌似已经插入数据库了, 那么怎么查看呢? 有两个办法: 继续写程序, 用程序来查. 另一个办法是安装sqlite客户端. 这节介绍这个办法.
你从这里下载sqlite客户端: 下载地址
解压后, 打开sqlitestudio, 你会看到一个并不很漂亮的框:
用快捷键 ctrl + o 打开增加数据库的界面, 如下:
数据库类型就是默认的 SQLite 3
File这里, 点右边的文件夹图标, 一直定位找到上面程序创建的testdb, 然后Name会自动填充. 点OK, 就能看到如下界面.
选择test, 鼠标右键点 connect to the database, 就能看到如下界面:
注意Tables下面的student 表, 双击, 会出来如下界面. 点击"data"切换, 就可以看到刚才程序插入的数据了.
用程序查找数据
在sql语言里, 用select 查找数据. 代码如下.
查找有两种情况: 一种是返回列表, 一种是通过where关键字限定查询结果, 返回单条数据. 但由于我一开始查的3条数据一模一样, 所以find_one 其实还是返回多条数据.
同时要注意, 执行完select语句之后, c 是什么呢? c 是 tuple对象的列表, 用Python语法来表示, 应该是这样:
[
('Diego',10),
('Diego',10),
('Diego',10)
]
所以在24-25行, 我故意循环这个结果. 让你看得更清楚.
更新数据
更新数据用 update, 代码如下
注意, update有可能更改多条数据, 也有可能只改一条数据. 这取决于有多少条记录满足 where 这个条件. 之前我们3个数据的age都是10, 所以上述程序更改了3个数据. 你可以用客户端看看是不是这样.
删除数据
删除和更新很像, 既可以删除多条数据也可以删除单条数据, 取决于where条件. 新手一定要记住.
好了, 写到这里, 增删改查总算写完了.