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. JS判断网页是否在微信中打开/

    JS判断网页是否在微信中打开,代码如下: <script type="text/javascript"> function is_weixn(){ var ua = n ...

  2. (转)C#图解—PictureBox.SizeMode 属性

    PictureBoxSizeMode.Normal: 默认情况下,在 Normal 模式中,Image 置于 PictureBox 的左上角,凡是因过大而不适合 PictureBox 的任何图像部分都 ...

  3. (转)android 蓝牙通信编程

    转自:http://blog.csdn.net/pwei007/article/details/6015907 Android平台支持蓝牙网络协议栈,实现蓝牙设备之间数据的无线传输. 本文档描述了怎样 ...

  4. MongoDB数据库未授权访问漏洞及加固

    1.漏洞危害 开启MongoDB服务时不添加任何参数时,默认是没有权限验证的,登录的用户可以通过默认端口无需密码对数据库任意操作(增删改高危动作)而且可以远程访问数据库. 2.漏洞成因 在刚安装完毕的 ...

  5. 解决pip安装超时

    我们在使用python开发的时候总会需要安装很多第三方模块 比如我用flask搭建web, 需要很多第三方模块,比如flask-sqlalchemy, flask-bootstrap等等.而这些模块用 ...

  6. 异步select

    server coding: #!/usr/bin/python # -*- coding: utf-8 -*- import select import socket import sys impo ...

  7. [SHOI2008]堵塞的交通traffic

    我是萌萌的传送门 这题说白了就是一个支持加边和删边的图连通性维护,不过鉴于图的特殊性,可以直接线段树(听说标算就是这个--). 然而我人比较懒,不想思考怎么线段树,于是乎写了一发分治并查集,1A我真是 ...

  8. MFC2016.6.8

    1.theApp extern声明之后不可以使用?可以用,只是需要extern之后的类名和类名称写对,不要犯得低级错误.2.怎样取出列表控件中的第某列的值?GetItemText(); CListCt ...

  9. Eclipce结合Ant进行编译、打包、传输、运行

    注意: 用Ant构建时,build path只能是单级的,如默认的src,如果是类似basePath/jsr253这样的话,运行Ant build时会报错,说找不到jsr253. (此文讲述的是以an ...

  10. 打开eclipse报错

    隔了一段时间没用eclipse, 打开之后报错: 从报错上来看是因为java版本太低导致的. 我打开cmd, 运行java -version 后 发现java 版本已经更新到了1.8 然后就有点懵. ...