设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 86803|回复: 83
打印 上一主题 下一主题

Python 实战(2):简单的数据库

[复制链接]

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
#
发表于 2015-4-12 11:37:10 |只看该作者 |正序浏览
someweb-02.png
上一次,我们已经在网页上显示出了我们要的影片信息。只是,这些信息是我直接在代码中用 dict 变量来定义的。试想以后网站要包含成千上万条影片信息,需要时常更新,并且当网站运行中断、重启之后仍然能保存之前的信息状态,通过这种方式肯定是难以满足的。一种办法是通过文件存储,将影片信息转成文本或通过“序列化”的方式保存在文件中(微信回复 33、65 可以查看相关文章)。但当数据量较大之后,直接通过文件读写和处理数据将会是一件非常复杂且耗时的操作,因此无法真正用来作为网站的数据存储。这时候,你就需要一个数据库来解决你的问题。

常见的数据库有 MySQL、Oracle、SQL Server、DB2、ACCESS 等等,虽然种类繁多,但其原理大都是相通的。在本项目中,我打算选择一款简单的数据库 -- SQLite。Linux 和较新版的 Mac 系统都默认装有 SQLite,Windows 下的安装也不复杂,另外 Python 2.7 直接带有对 SQLite 的支持,无需再安装其他模块。所以对于入门数据库,或者做一些小项目来说,SQLite 是个不错的选择。

我现在将创建一个叫做 MovieSite.db 的数据库,用来作为电影网站的数据存储。在命令行下输入:

sqlite3 MovieSite.db

如果你系统里的 sqlite 已正常安装,将会看到提示符变成

sqlite>

这表示你已进入 sqlite 的控制台。注意,你运行 sqlite3 时所在的目录将会决定你创建的数据库文件所在位置,文件名就是你定的数据库名。你需要至少创建一张表,这个数据库才会被创建并保存。

所谓一张表,指的是数据库存储一组数据的结构,你可以把它想象成一张 excel 的列表。这个表会有很多列属性,每一条数据就是表里的一行。这里我只粗略地介绍一下使用,深入的了解数据库请参考相关书籍。

在 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 退出控制台。

现在,你可以输入查询语句

select * from movie;

查看刚刚添加到 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 里的建表语句,然后重新建立数据库,再读取文件重建数据表和其中的数据。

至此,我们已经为这个电影网站加上了数据库。但显然,我不可能手动添加众多电影信息。所以接下来,我需要一些外部的数据源,来扩充这个网站的内容。豆瓣是个好网站,嗯。

someweb-2-code.py (325 Bytes, 下载次数: 417)
someweb-2-index.html (185 Bytes, 下载次数: 344)

someweb-2-tables.sql (1.95 KB, 下载次数: 366)


#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

83#
发表于 2019-12-23 23:43:09 |只看该作者
xiaozhiamy 发表于 2019-12-23 22:42
在D:\sqlite下,放入tables.sql,然后在 SQLite 控制台下输入命令:
.read tables.sql

sqlite3 MovieSite.db
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

26

积分

新手上路

Rank: 1

82#
发表于 2019-12-23 22:42:15 |只看该作者
在D:\sqlite下,放入tables.sql,然后在 SQLite 控制台下输入命令:
.read tables.sql

之后看到:
可查询到有movie表格

数据库MovieSite.db大小为0KB?

数据库大小为0KB很奇怪

然后在程序中用db=web.database(dbn=‘sqlite’,db=‘D:\sqlite\MovieSite.db’)调用
代码中调用路径也写对了.PNG

会提示:

提示找不到movie
一直找不到原因?请教一下各位 多谢了
————————————————
版权声明:本文为CSDN博主「xiaozhiamy」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xiaozhiamy/article/details/103674635

回复

使用道具 举报

0

主题

0

好友

26

积分

新手上路

Rank: 1

81#
发表于 2019-12-23 22:35:43 |只看该作者
用.read tables.sql命令建立的MovieSite.db大小为0KB,但是用select * from movie;却可以查到数据是什么原因呢?
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

80#
发表于 2019-10-14 14:38:33 |只看该作者
delapi 发表于 2019-10-14 05:39
请问如果我用的是微软access数据库,db = web.database(dbn=后面应该写什么,我试了几种,都是说unknown db ...

不支持。
数据库支持 mysql 和 Postgres,而且需要装对应的库,并不是写个名字就自动可以的

文档里有
http://webpy.org/docs/0.3/tutorial.zh-cn#databasing
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

130

积分

注册会员

Rank: 2

79#
发表于 2019-10-14 05:39:23 |只看该作者
请问如果我用的是微软access数据库,db = web.database(dbn=后面应该写什么,我试了几种,都是说unknown db
回复

使用道具 举报

0

主题

0

好友

146

积分

注册会员

Rank: 2

78#
发表于 2019-8-15 17:33:20 |只看该作者
本帖最后由 boat 于 2019-8-15 17:34 编辑

数据库用的MySQL,用了pymysql来连接数据库
遇到的问题是mysql里读取tables.sql时,出现问题fail to open,ERROR 22
把'\'改成'\\'还是会出现错误,但是数据写进去了。
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

77#
发表于 2018-5-31 00:20:53 |只看该作者
少年与猫. 发表于 2018-5-30 19:41
运行的时候一直打不开数据库

文件放的地址不对吧,settings里也查一查
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

2

主题

0

好友

44

积分

新手上路

Rank: 1

76#
发表于 2018-5-30 19:41:10 |只看该作者
本帖最后由 少年与猫. 于 2018-5-30 19:43 编辑

运行的时候一直打不开数据库

CH9MM_WV{KY8`U4{JLU1GWT.png (12.08 KB, 下载次数: 494)

CH9MM_WV{KY8`U4{JLU1GWT.png

回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

75#
发表于 2018-5-11 22:18:45 |只看该作者
Vicky-奥利奥 发表于 2018-5-11 16:18
请问出现这个错误怎么解决啊?

我也没看出哪里有问题

你试试用帖子里的代码,然后通过命令行启动程序看看是否可以
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

14

积分

新手上路

Rank: 1

74#
发表于 2018-5-11 16:18:59 |只看该作者
本帖最后由 Vicky-奥利奥 于 2018-5-11 16:27 编辑

请问出现这个错误怎么解决啊?

C:\Users\HuangYanQun\Desktop\1.png

1.png (75.03 KB, 下载次数: 488)

1.png

2.png (17.26 KB, 下载次数: 475)

2.png

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-11-22 14:06 , Processed in 0.018306 second(s), 26 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部