数据库

当程序运行结束时,通常需要将数据保存到磁盘上,而如何定义数据的格式就是一个大问题
假如我们需要保存一个班级的成绩

名字 成绩
Bob 85
Lisa 55

你可以用一个文本文件保存,一行保存一个学生,用,隔开:

Michael,99
Bob,85 Bart,
59 Lisa,87

你还可以用JSON格式保存,也是文本文件:

[
{“name”:“Michael”,“score”:99},
{“name”:“Bob”,“score”:85},
{“name”:“Bart”,“score”:59},
{“name”:“Lisa”,“score”:87}
]

你还可以定义其他的各种格式,但是这样做:
存储和读取需要自己实现,JSON还是标准,自己定义的格式就各式各样了
不能做快速查询,必须把所有的文件读入内存中才能自己遍历,假如文件大小超过了内存大小,比如遇见一个40G的蓝光电影,根本无法读入内存。
为了便于保存数据和读取数据,就出现了数据库这种专门用于集中储存和查询的软件

数据库的历史非常悠久,1950年就有数据库了,经历了网状数据库、层次数据库、我们现在广泛使用的关系数据库是基于上世纪70年代关系模型的基础上诞生的

SQLite

SQLit是一种嵌入式数据库,它的数据库是一个文件,本身是用C实现的而且体积很小,所以,经常被集成到各种应用程序中,甚至在iOS和Android的App中都可以集成。
Python就内置了SQLite3,所以,在Python中使用SQLite,不需要安装任何东西,直接使用。

要操作关系性数据库,首先要连接到数据库,一个数据库称为一个Connection
连接到数据库后,需要打开游标,称之为Cursor通过Cursor执行SQL语句,然后,获得执行结果。
Python定义了一套操作数据库的API接口.任何数据库要连接到Python,只需要提供符合Python标准的数据库驱动即可
SQLite的驱动内置在Python的标准库中

# 导入SQLite驱动:
>>> import sqlite3
# 连接到SQLite数据库
# 数据库文件是test.db
# 如果文件不存在,会自动在当前目录创建:
>>> conn = sqlite3.connect('test.db')
# 创建一个Cursor:
>>> cursor = conn.cursor()
# 执行一条SQL语句,创建user表:
>>> cursor.execute('create table user (id varchar(20) primary key, name varchar(20))')
<sqlite3.Cursor object at 0x10f8aa260>
# 继续执行一条SQL语句,插入一条记录:
>>> cursor.execute('insert into user (id, name) values (\'1\', \'Michael\')')
<sqlite3.Cursor object at 0x10f8aa260>
# 通过rowcount获得插入的行数:
>>> cursor.rowcount#是最近一次的结果
1
#获得查询结果
>>> cursor.execute('select * from user where id=?', ('1',))
<sqlite3.Cursor object at 0x10f8aa340>
# 获得查询结果集:
>>> values = cursor.fetchall()
>>> values
[('1', 'Michael')]
# 关闭Cursor:
>>> cursor.close()
# 提交事务:
>>> conn.commit()
# 关闭Connection:
>>> conn.close()

使用Python的DB-API时,只要搞清楚ConnectionCursor对象,打开后一定记得关闭,就可以放心地使用。
使用Cursor对象执行insert,update,delete语句时,执行结果由rowcount返回影响的行数,就可以拿到执行结果。

使用Cursor对象执行select语句时,通过featchall()可以拿到结果集。结果集是一个list,每个元素都是一个tuple,对应一行记录。
如果SQL语句带有参数,那么需要把参数按照位置传递给execute()方法,有几个?占位符就必须对应几个参数,例如:

cursor.execute('select * from user where name=? and pwd=?', ('abc', 'password'))

要确保打开的Connection对象和Cursor对象都正确地被关闭,否则,资源就会泄露。

操作Mysql

mysql是专门为服务器设计的数据库,能承受高并发。mysql服务器以独立的进程运行,通过网络对外服务

所以,需要支持Python的MySQL驱动来连接到MySQL服务器。MySQL官方提供了mysql-connector-python驱动,但是安装的时候需要给pip命令加上参数--allow-external

$ pip install mysql-connector-python --allow-external mysql-connector-python
如果上面的命令安装失败,可以试试另一个驱动:

$ pip install mysql-connector
我们演示如何连接到MySQL服务器的test数据库:

 # 导入MySQL驱动:
>>> import mysql.connector# 注意把password设为你的root口令:
>>> conn = mysql.connector.connect(user='root', password='password', database='test')
>>> cursor = conn.cursor()

由于Python的DB-API定义都是通用的,所以,操作MySQL的数据库代码和SQLite类似。只是:

  1. 执行INSERT等操作后要调用commit()提交事务;
  2. MySQL的SQL占位符是%s。

在程序中使用以SQLite为例

需要使用数据库的文件绝对路径

# -*- coding: utf-8 -*-
import os, sqlite3db_file = os.path.join(os.path.dirname(__file__), 'test.db')
if os.path.isfile(db_file):os.remove(db_file)# 初始数据:
conn = sqlite3.connect(db_file)
cursor = conn.cursor()
cursor.execute('create table user(id varchar(20) primary key, name varchar(20), score int)')
cursor.execute(r"insert into user values ('A-001', 'Adam', 95)")
cursor.execute(r"insert into user values ('A-002', 'Bart', 62)")
cursor.execute(r"insert into user values ('A-003', 'Lisa', 78)")
cursor.execute(r"select name from user where ?<=score and score<=?",(96,99))
print(cursor.fetchall())
cursor.close()
conn.commit()
conn.close()def get_score_in(low, high):' 返回指定分数区间的名字,按分数从低到高排序 'conn=sqlite3.connect(db_file)cursor=conn.cursor()cursor.execute(r'select name from user where score between ? and ? order by score',(low,high))a=[i[0] for i in cursor.fetchall()]cursor.close()conn.close()return a
# 测试:
assert get_score_in(80, 95) == ['Adam'], get_score_in(80, 95)
assert get_score_in(60, 80) == ['Bart', 'Lisa'], get_score_in(60, 80)
assert get_score_in(60, 100) == ['Bart', 'Lisa', 'Adam'], get_score_in(60, 100)
print('Pass')

Python 访问数据库相关推荐

  1. python访问数据库

    1. python DB api简介 python DB api python访问数据库的统一接口规范,详细可参考https://www.python.org/dev/peps/pep-0249/ p ...

  2. python获取mysql中的数据供js调用_详解js文件通过python访问数据库方法

    我来教你 js文件怎么通过python访问数据库,希望能够为你带来帮助. 1.如果是要提交表单内容给 服务器的 python 处理,那么只需要在表单 里面的 action 填写服务端的处理路由就可以了 ...

  3. 使用程序设计语言访问SQL:JDBC、从Python访问数据库、ODBC、嵌入式SQL

    SQL 提供了一种强大的声明式查询语言.用 SQL 编写查询通常比用通用程序设计语言同样的查询进行编码要简单得多.然而,基于至少两种原因数据库程序员必须能够访问通用程序设计语言: 1.因为 SQL 并 ...

  4. python访问数据库如何解决高并发_怎样解决数据库高并发的问题

    怎样解决数据库高并发的问题?解决数据库高并发使用缓存式的Web应用程序架构.增加Redis缓存数据库.增加数据库索引.页面静态化.使用存储过程.MySQL主从读写分离.分表分库.负载均衡集群. 解决数 ...

  5. python访问数据库如何解决高并发_使用 Python 和 Oracle 数据库实现高并发性

    随着趋势发展的核心转向更多而不是更快发展,最大限度地提高并发性的重要性日益凸显.并发性使得编程模式发生了新的转变,可以编写异步代码,从而将多个任务分散到一组线程或进程中并行工作.如果您不是编程新手并且 ...

  6. python访问数据库oracle_python连接oracle数据库

    结合自己公司项目练练手数据库这块的操作. 我公司所有项目均使用oracle数据库,就需要先安装oracle相关的.whl文件.在网上找了一些关于"python连接数据库"的相关帖子 ...

  7. python访问数据库统一方法_Python 3.x 连接数据库(pymysql 方式)

    参考:http://www.cnblogs.com/woider/p/5926744.html ==================pymysql=================== 1.PyMyS ...

  8. python访问数据库日志文件_python利用inotify实现把nginx日志实时写入数据库

    利用了pyinotify库,我用的是这里的这个,外链网址已屏蔽 其实网上yum上也有pyinotify库可以安装. 写入数据库是pymysql这里做一下记录, 先务pyinotify实现一个tail ...

  9. Python MySQL 数据库

    python DB API python访问数据库的统一接口规范,完成不同数据库的访问 包含的内容: connection cursor exceptions 访问数据库流程: 1.创建connect ...

最新文章

  1. Servlet入门 代码
  2. python的优缺点-Python 有什么一般人不知道的缺点?
  3. 被 C# 的 ThreadStatic 标记的静态变量,都存放在哪里了?
  4. Java ObjectStreamClass lookup()方法与示例
  5. 发现Diolar 的边缘检测程序好像也有缺点
  6. 换一种姿势阅读《人工智能简史》
  7. 利用计算机名称共享打印机步骤,如何连接共享打印机汇总教程
  8. 一个华为人在华为工作十年的感悟
  9. 基于IMDb数据集的情感分析(TF-IDF与机器学习实现)
  10. C#使用消息队列(MSMQ)
  11. python编程midi键盘按键_Python中捕获键盘的方式详解
  12. HBuilderx打包h5的APP,解决获取相机权限问题
  13. 2020Java开发工程师面试题
  14. 医疗行业信息系统面试准备
  15. 怎么在 Windows 下生成 文档树 tree?
  16. C# Volo.Abp使用原生sql语句查询
  17. Prometheus监控系列-- 进阶阶段 | 高级操作 | 配合Grafana | 邮箱报警 | 参数说明
  18. vika维格表和飞书,多维表格如何改变我们的工作方式?
  19. STM32F407多路串口通信进行数据收发
  20. python闰月计算_Python实现150年公历农历换算

热门文章

  1. 脱口而出的100句英语句子
  2. 小游戏体验——测试王者荣耀的英雄人物
  3. 访问网页,证书错误是VMware的证书的解决办法
  4. Firefox restClient如何发送post请求解决方法---谷营乡中西软件科技园--zdd
  5. Spine 由PSD导入
  6. 香港主机上传文件慢怎么办?
  7. Java打印各种形状 心形 菱形 三角形 圆形
  8. jquery文档就绪_在jQuery中,下列关于文档就绪函效的写法错误的是( )
  9. 如何让centos7虚拟机联网
  10. ARM Cortex各系列处理器分类比较