14.4 创建数据库和表

  相比Python的列表和字典,数据库需要更多的已定义结构。

  在我们创建数据库表之前,我们必须预先告诉数据库表和列的命名,以及计划保存到列中和数据类型。当数据库软件预先知道每列中的数据类型,它就可以选择最有效的方式保存和查找数据。

  你可以通过以下链接,查看SQLite支持的各种数据类型:

  http://www.sqlite.org/datatypes.html

  预先定义数据结构看起来不是很方便,但它可以使你快速访问数据即使数据库中包含了大量数据。

  以下代码创建了一个数据库文件,以及一个名为Tracks、内有两个列的表:

import sqlite3

conn = sqlite3.connect('music.sqlite3')
cur = conn.cursor() cur.execute('DROP TABLE IF EXISTS Tracks')
cur.execute('CREATE TABLE Tracks (title TEXT, plays INTERGER)') conn.close()

  连接操作创建了一个至当前目录下名为music.sqlite3数据库文件的“连接”。如果这个文件不存在,它会创建一个。因为有些时候数据库文件保存在一个与应用程序独立的数据库服务器上,所以打开数据库文件的操作被称为“连接”。在我们这个简单的例子里,数据库文件和代码则保存在同一目录下。

  光标类似文件句柄,我们利用光标来完成数据操作,调用cursor()和调用open()处理文本文件在概念上非常相似。

  一旦我们获取光标,我们就可以使用execute()方法来执行数据库命令。数据库命令通过一种特殊的、已被标准化的语言来表示,使得我们只学一种语言就可操做不同厂家的数据库。这种特殊语言称为结构化查询语言,简称SQL。详细信息可查阅:http://en.wikipedia.org/wiki/SQL

  在我们的示例中,在我们的数据中执行了两条SQL命令。作为约定,我们将SQL关键字用大写表示,而我们添加的表名和列名将用小写表示。

  第一条SQL命令从数据库中删除名为Tracks的表(如果存在),这种方式可以简单地让我们一遍又一遍的运行相同的程序来创建表Tacks,而不会引起错误。注意DROP TABLE命令将从数据库中删除表以及表中的所有内容。

cur.execute('DROP TABLE IF EXISTS Tracks ')

  第二条命令创建了一张名为Tracks的表,表中包含两个列,分别名为文本类型的title和整数类型的plays。

cur.execute('CREATE TABLE Tracks (title TEXT, plays INTEGER)')

  现在我们创建了表Tracks,我们可以用SQL INSERT命令往表中插入数据。所以我们再次连接数据库获取光标,并执行SQL命令。

  SQL INSERT命令指明我们要往哪张表插入数据,然后通过列出我们想包含的字段(title, plays) 来定义一个新行,后面跟着的VALUE来定义要放入新行中的数据。我们用问号(?,?)来表示我们要传入的是一个元组,其实际数值是execute()调用中的第二个参数('My Way', 15)。

import sqlite3

conn = sqlite3.connect('music.sqlite3')
cur = conn.cursor() cur.execute('INSERT INTO Tracks (title, plays) VALUES (?, ?)',
('Thunderstruck', 20))
cur.execute('INSERT INTO Tracks (title, plays) VALUES (?, ?)',
('My Way', 15))
conn.commit() print('Tracks:')
cur.execute('SELECT title, plays FROM Tracks')
for row in cur:
print (row) cur.execute('DELETE FROM Tracks WHERE plays < 100')
conn.commit() conn.close()

  首先我们往表里插入了两行数据,然后使用commit()方法促使数据被写入数据库文件,表Tracks的内容如下图所示:


  然后我们使用SELECT命令获取我们刚刚插入的行。在SELECT命令中,我们指明想从哪张表读取数据,以及想读取的列。在我们执行SELECT语句后,光标成为一个可以用for语句遍历的对象。为了提高效率,在执行SELECT命令时,光标并不读取数据库中的所有信息,而只按需读取在for语句中遍历的信息。这个程序的输出如下:

Tracks:
('Thunderstruck', 20)
('My Way', 15)

  我们的循环找到了两行数据,每一行是Python的元组类型,元组的第一个值是歌名title,第二个值是播放的次数plays。

  为了让我们的程序多次运行,在程序的最后,我们执行一个SQL DELETE命令删除了我们创建的行。DELETE命令中的WHERE子句可以让我们限制一个条件,这样我们可以要求数据库只将命令应用到符合条件的行。在这个例子里,限制条件恰好应用到所有行,清空了整个表,使得我们可以重复运行程序。在DELETE命令之后,我们再次调用commit()方法促使数据库删除数据。

注:文章原文为Dr. Charles Severance 的 《Python for Informatics》。文中代码用3.4版改写,并在本机测试通过。  

Python for Infomatics 第14章 数据库和SQL应用二(译)的更多相关文章

  1. Python for Infomatics 第14章 数据库和SQL应用一(译)

    14.1 什么是数据库 数据库一种存储结构数据的文件.绝大多数数据库类似字典——映射键和值的关系.最大的区别是数据库是保存在硬盘或其它永久性的存储上,所以在程序结束后它仍然存在.而保存在内存中的字典容 ...

  2. Python for Infomatics 第14章 数据库和SQL应用三(译)

    14.5 SQL 总结 到目前为止,我们在Python示例程序中使用了SQL,并且涉及了许多SQL基础.在这一小节中,我们特别审视SQL语言,并对其语法进行回顾. 虽然有很多不同的数据库供应商,但因S ...

  3. php大力力 [016节] 兄弟连高洛峰php教程(2014年 14章数据库章节列表)

    2015-08-25 php大力力016 兄弟连高洛峰php教程(2014年 14章数据库章节列表) [2014]兄弟连高洛峰 PHP教程14.1.1 复习数据库  15:58 [2014]兄弟连高洛 ...

  4. 数据库学习---SQL基础(二)

    数据库学习---SQL基础(一) 数据库学习---SQL基础(二) 数据库学习---SQL基础(三) 上篇复习的sql的增删改查,and ,or ,>=, <=,!=等逻辑运算符,还有in ...

  5. 《SQL 基础教程》—第一章:数据库与 SQL

    导言 这一章的内容如下: 数据库简介 SQL 概要 表的创建 表的删除与更新 数据库简介 定义: Database, 是大量数据的集合Database Management System,是用于管理数 ...

  6. 第一章 数据库和SQL

    1-1 数据库是什么?   一.数据库的含义 数据库是将大量数据保存起来,通过计算机加工而成的可以进行高效访问的数据集合. 数据库DB   二.数据库管理系统 DBMS 用来管理数据库的计算机系统称为 ...

  7. Python使用cx_Oracle模块操作Oracle数据库--通过sql语句和存储操作

    https://www.jb51.net/article/125160.htm?utm_medium=referral  Python使用cx_Oracle调用Oracle存储过程的方法示例 http ...

  8. Python for Infomatics 第13章 网页服务四(译)

    这几天因为其他事务,打断了自己的学习计划,今天继续我的翻译,避免又中途而废. 注:文章原文为Dr. Charles Severance 的 <Python for Informatics> ...

  9. Python for Infomatics 第12章 网络编程一(译)

    注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 本书中的许多例子关注的是读取文件 ...

随机推荐

  1. Java读取word文件,字体,颜色

    在Android读取Word文件时,在网上查看时可以用tm-extractors,但好像没有提到怎么读取Word文档中字体的颜色,字体,上下标等相关的属性.但由于需要,要把doc文档中的内容(字体,下 ...

  2. filter : progid:DXImageTransform.Microsoft.AlphaImageLoader ( enabled=bEnabled , sizingMethod=sSize , src=sURL )

    很多时候需要将图片显示在网页上,一般都会这样做,如下: <img src="xxx.jpg"/> 是的,这样是可以做到,但是如果我要将本地的图片显示到页面上呢?你可能会 ...

  3. python之路十八

    1.JS 正则    test   - 判断字符串是否符合规定的正则        rep = /\d+/;        rep.test("asdfoiklfasdf89asdfasdf ...

  4. EndNote(一)之基本介绍

    作为一个经常看文献的人,发现看了很多文献,但是之后需要再找某一篇文献的时候,却无法找到文献在哪里了.混乱的文献管理方式,浪费了很多时间在翻阅自己已经看过的文献之中.这是一件很头痛的事情,才想起借助软件 ...

  5. 面向过程(POP)、面向对象(OOP)、面向接口(IOP)、面向切面(AOP)

    面向过程:典型的是C/C++的结构体,结构体里只有变量,没有处理变量的方法,需要专门编写处理变量的方法. 面向对象:ArrayList<Integer> list=new ArrayLis ...

  6. java--字符串

    一.基本数据类型 基本类型 大小 对应的包装类 最小值 最大值 byte 8-bit Java.lang.Byte -128 +127 short 2Byte= 16bit Java.lang.Sho ...

  7. Python模块之"prettytable"

    Python模块之"prettytable" 摘要: Python通过prettytable模块可以将输出内容如表格方式整齐的输出.(对于用Python操作数据库会经常用到) 1. ...

  8. ALS

    最近看了一些关于ALS(肌萎缩性脊髓侧索硬化症)的电视剧和一本ALS患者的生活自述的书. 一次偶然的机会在一部日剧<我所存在的时间>中看到了ALS这种疾病,感觉这就像众病之王--癌症一样, ...

  9. cacti 安装

    cacti:是常用的一个监控软件(开源,免费) 特点:重图形,有数据历史,需要用到数据库的支持,支持web配置,默认不支持告警,可以加插件 cacti安装 1.安装扩展源epel (nagios 和z ...

  10. ubantu php7.0版本降级到php5.6

    http://askubuntu.com/questions/756879/cant-install-php5-on-ubuntu-16-04