首页投稿(暂停使用,暂停投稿)程序员

python|初探数据库

2018-02-15  本文已影响0人  turbotx
前言

如果你想用做个网站。你一想,一个网站要包含成千上万条信息,而且需要时常更新,并且当网站运行中断、重启之后还得保存之前的信息状态。这个时候你要怎么办?

直接在代码中定义肯定不行了,不过你可以将信息转成文本或通过“序列化”方式保存在文件中,但数据量变大就很复杂且耗时。其实呀,一个数据库就可以来解决你的问题。它便于保存程序和读取数据,还能直接通过条件快速查询到指定数据

经过网状数据库层次数据库再到关系数据库的发展,数据库家族已经越来越壮大了,大概可以分为两类:

①付费的商用数据库:oracle、SQL、Server(微软),DB2(IBM的产品)、Sybase等;②免费的开源数据库:MySQL、PostgreSQL、SQLite等。

常见的数据库有 MySQL、Oracle、SQL Server、DB2、ACCESS 等等,虽然种类繁多,但其原理大都是相通的。接下来主要讲讲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 table、insert 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-8。MySQL的配置文件默认存放在/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类似。

注意:

1、MySQL的SQL占位符是%s;

2、通常我们在连接MySQL时传入use_unicode=True,让MySQL的DB-API始终返回Unicode。


                                                             除夕快乐大家!

上一篇 下一篇

猜你喜欢

热点阅读