如果你想用做个网站你一想, 一个网站要包含成千上万条信息, 而且需要时常更新, 并且当网站运行中断重启之后还得保存之前的信息状态这个时候你要怎么办?
直接在代码中定义肯定不行了, 不过你可以将信息转成文本或通过序列化方式保存在文件中, 但数据量变大就很复杂且耗时其实呀, 一个数据库就可以来解决你的问题它便于保存程序和读取数据, 还能直接通过条件快速查询到指定数据
经过网状数据库到层次数据库再到关系数据库的发展, 数据库家族已经越来越壮大了, 大概可以分为两类:
付费的商用数据库: oracleSQLServer(微软),DB2(IBM 的产品)Sybase 等; 免费的开源数据库: MySQLPostgreSQLSQLite 等
常见的数据库有 MySQLOracleSQL ServerDB2ACCESS 等等, 虽然种类繁多, 但其原理大都是相通的接下来主要讲讲 SQLite 和 MySQL
一 SQLite
SQLite 是一种嵌入式数据库, 是由 C 写的体积很小的文件 Linux 和较新版的 Mac 系统都默认装有 SQLite,Windows 下的安装也不复杂, 另外 Python(2.7.x) 内置了 SQLite3, 在 Python 中使用 SQLite, 不需要安装任何东西, 便直接使用, 以 SQLite3 为例:
基本的数据操作
数据查询
所以对于入门数据库, 或者做一些小项目来说, SQLite 是个不错的选择
我现在将创建一个叫做 MovieSite.db 的数据库, 用来作为电影网站的数据存储在命令行下输入:
sqlite3 MovieSite.db
如果你系统里的 sqlite 已正常安装, 将会看到提示符变成
sqlite>
这表示你已进入 sqlite 的控制台注意, 你运行 sqlite3 时所在的目录将会决定你创建的数据库文件所在位置, 文件名就是你定的数据库名你需要至少创建一张表, 这个数据库才会被创建并保存
表就是数据库中存放关系数据的集合, 一个数据库里面有多个表, 表与表之间用外键关联
在 SQLite 的控制台下输入:
create table movie (title, year, country, abstract);
这条命令将建立一张叫做 movie 的表, 表的结构是 4 列属性, 分别用来记录电影的标题年份国家简介
再通过命令向刚刚建立的表里添加一些数据:
- insert into movie values('阿甘正传', 1994, '美国', 'Life is like a box of chocolates." );
- insert into movie values('肖申克的救赎', 1994, '美国', 'Hope is a good thing.');
类似 create tableinsert into 这类以 ; 结尾的命令被称作 SQL 语句, 它们是数据库的通用操作通过它们你可以创建表增删改查数据等等在输入的时候, 务必注意要使用英文半角符号
而 SQLite 还提供了一些操作:
输入. help 可以查看这些命令注意这些命令前面都有一个英文点号
.databases 查看当前的数据库列表,
.tables 查看当前的表,
.quit 退出控制台
现在, 你可以输入查询语句查看刚刚添加到 movie 表中的所有数据:
select * from movie;
确认数据库的表中已经有了我们想要的数据之后, 接下来要解决的就是如何从网站程序中调用这些数据
web.py 连接 SQLite 很简单, 只需要一行语句:
db = web.database(dbn='sqlite', db='MovieSite.db')
现在可以把先前程序中定义的 movies 变量给去掉了, 然后将 GET 方法修改为:
- def GET(self):
- movies = db.select('movie')
- return render.index(movies)
同之前一样, 刷新网页, 你将看到和上次一样的页面只不过现在的数据来源于 SQLite 的数据库中
修改一下模板, 加上两项新属性, 让页面显示更多信息:
$movie['country'], $movie['abstract']
为了让创建数据库的过程更加方便, 通常会将之前我们使用的 SQL 语句写在一个文件里比如, 创建一个 tables.sql 的文件, 在里面写上:
- create table movie(title, year, country, abstract);
- insert into movie values('阿甘正传', 1994, '美国', 'Life is like a box of chocolates.');
- insert into movie values('肖申克的救赎', 1994, '美国', 'Hope is a good thing.');
然后在 SQLite 控制台下输入命令:
.read tables.sql
就可以一次性完成之前的建表和添加数据的操作因此, 当下次想要修改数据库的时候, 一种简单粗暴的方法就是, 删除 MovieSite.db 文件, 修改 tables.sql 里的建表语句, 然后重新建立数据库, 再读取文件重建数据表和其中的数据
至此, 我们已经为这个电影网站加上了数据库但显然, 我不可能手动添加众多电影信息所以接下来, 我需要一些外部的数据源, 来扩充这个网站的内容豆瓣是个好网站, 嗯
注意:
1 在 Python 中操作数据库时, 要先导入数据库对应的驱动, 然后, 通过 Connection 对象和 Cursor 对象操作数据
2 要确保打开的 Connection 对象和 Cursor 对象都正确地被关闭, 否则, 资源就会泄露
3 如何才能确保出错的情况下也关闭掉 Connection 对象和 Cursor 对象呢? 请回忆 try:...except:...finally:... 的用法
二 MySQL
MySQL 是 Web 世界中使用最广泛的数据库服务器 SQLite 的特点是轻量级可嵌入, 但不能承受高并发访问, 适合桌面和移动应用而 MySQL 是为服务器端设计的数据库, 能承受高并发访问, 同时占用的内存也远远大于 SQLite
此外, MySQL 内部有多种数据库引擎, 最常用的引擎是支持数据库事务的 InnoDB
安装 MySQL 可以直接从 MySQL 官方网站下载最新的 Community Server 5.6.x 版本 MySQL 是跨平台的, 选择对应的平台下载安装文件即可
在 Windows 上, 安装时请选择 UTF-8 编码, 以便正确地处理中文; 在 Mac 或 Linux 上, 需要编辑 MySQL 的配置文件, 把数据库默认的编码全部改为 UTF-8MySQL 的配置文件默认存放在 / etc/my.cnf 或者 / etc/mysql/my.cnf:
- [client]
- default-character-set =utf8
- [mysqld]
- default-storage-engine =INNODB
- character-set-server =utf8
- collation-server =utf8_general_ci
重启 MySQL 后, 可以通过 MySQL 的客户端命令行检查编码:
看到 utf8 字样就表示编码设置正确
安装 MySQL 驱动
由于 MySQL 服务器以独立的进程运行, 并通过网络对外服务, 所以, 需要支持 Python 的 MySQL 驱动来连接到 MySQL 服务器
目前, 有两个 MySQL 驱动:
mysql-connector-python: 是 MySQL 官方的纯 Python 驱动;
MySQL-python: 是封装了 MySQL C 驱动的 Python 驱动
可以把两个都装上, 使用的时候再决定用哪个:
- $ easy_install mysql-connector-python
- $ easy_installMySQL-python
我们以 mysql-connector-python 为例, 演示如何连接到 MySQL 服务器的 test 数据库:
连接 MySQL 服务器的 test 数据库
由于 Python 的 DB-API 定义都是通用的, 所以, 操作 MySQL 的数据库代码和 SQLite 类似
注意:
1MySQL 的 SQL 占位符是 %s;
2 通常我们在连接 MySQL 时传入 use_unicode=True, 让 MySQL 的 DB-API 始终返回 Unicode
除夕快乐大家!
来源: http://www.jianshu.com/p/b183078ba761