数据库类别

既然我们要使用关系数据库,就必须选择一个关系数据库。

目前广泛使用的关系数据库也就这么几种:

付费的商用数据库:

  • Oracle,典型的高富帅;
  • SQL Server,微软自家产品,Windows定制专款;
  • DB2,IBM的产品,听起来挺高端;
  • Sybase,曾经跟微软是好基友,后来关系破裂,现在家境惨淡。

这些数据库都是不开源而且付费的,最大的好处是花了钱出了问题可以找厂家解决。

但无论是Google、Facebook,还是国内的BAT,无一例外都选择了免费的开源数据库:

  • MySQL,大家都在用,一般错不了;
  • PostgreSQL,学术气息有点重,其实挺不错,但知名度没有MySQL高;
  • sqlite,嵌入式数据库,适合桌面和移动应用。

作为Python开发工程师,选择哪个免费数据库呢?

当然是MySQL。因为MySQL普及率最高,出了错,可以很容易找到解决方法。而且,围绕MySQL有一大堆监控和运维的工具,安装和使用很方便。

MySQL是Web世界中使用最广泛的数据库服务器。

SQLite的特点是轻量级、可嵌入,但不能承受高并发访问,适合桌面和移动应用。

而MySQL是为服务器端设计的数据库,能承受高并发访问,同时占用的内存也远远大于SQLite。

此外,MySQL内部有多种数据库引擎,最常用的引擎是支持数据库事务的InnoDB。

安装MySQL

可以直接从MySQL官方网站下载最新的Community Server 5.6.x版本。

MySQL是跨平台的,选择对应的平台下载安装文件,安装即可。

安装时,MySQL会提示输入root用户的口令,请务必记清楚。如果怕记不住,就把口令设置为password。

在Windows上,安装时请选择UTF-8编码,以便正确地处理中文。

在Mac或Linux上,需要编辑MySQL的配置文件,把数据库默认的编码全部改为UTF-8。MySQL的配置文件默认存放在/etc/my.cnf或者/etc/mysql/my.cnf:

  1. [client]
  2. default-character-set = utf8
  3.  
  4. [mysqld]
  5. default-storage-engine = INNODB
  6. character-set-server = utf8
  7. collation-server = utf8_general_ci

重启MySQL后,可以通过MySQL的客户端命令行检查编码:

  1. $ mysql -u root -p
  2. Enter password:
  3. Welcome to the MySQL monitor...
  4. ...
  5.  
  6. mysql> show variables like '%char%';
  7. +--------------------------+--------------------------------------------------------+
  8. | Variable_name | Value |
  9. +--------------------------+--------------------------------------------------------+
  10. | character_set_client | utf8 |
  11. | character_set_connection | utf8 |
  12. | character_set_database | utf8 |
  13. | character_set_filesystem | binary |
  14. | character_set_results | utf8 |
  15. | character_set_server | utf8 |
  16. | character_set_system | utf8 |
  17. | character_sets_dir | /usr/local/mysql-5.1.65-osx10.6-x86_64/share/charsets/ |
  18. +--------------------------+--------------------------------------------------------+
  19. 8 rows in set (0.00 sec)

看到utf8字样就表示编码设置正确。

:如果MySQL的版本≥5.5.3,可以把编码设置为utf8mb4,utf8mb4和utf8完全兼容,但它支持最新的Unicode标准,可以显示emoji字符。

安装MySQL驱动

由于MySQL服务器以独立的进程运行,并通过网络对外服务,所以,需要支持Python的MySQL驱动来连接到MySQL服务器。MySQL官方提供了mysql-connector-python驱动,但是安装的时候需要给pip命令加上参数--allow-external:

  1. $ pip install mysql-connector-python --allow-external mysql-connector-python

如果上面的命令安装失败,可以试试另一个驱动:

  1. $ pip install mysql-connector

我们演示如何连接到MySQL服务器的test数据库:

  1. # 导入MySQL驱动:
  2. >>> import mysql.connector
  3. # 注意把password设为你的root口令:
  4. >>> conn = mysql.connector.connect(user='root', password='password', database='test')
  5. >>> cursor = conn.cursor()
  6. # 创建user表:
  7. >>> cursor.execute('create table user (id varchar(20) primary key, name varchar(20))')
  8. # 插入一行记录,注意MySQL的占位符是%s:
  9. >>> cursor.execute('insert into user (id, name) values (%s, %s)', ['1', 'Michael'])
  10. >>> cursor.rowcount
  11. 1
  12. # 提交事务:
  13. >>> conn.commit()
  14. >>> cursor.close()
  15. # 运行查询:
  16. >>> cursor = conn.cursor()
  17. >>> cursor.execute('select * from user where id = %s', ('1',))
  18. >>> values = cursor.fetchall()
  19. >>> values
  20. [('1', 'Michael')]
  21. # 关闭Cursor和Connection:
  22. >>> cursor.close()
  23. True
  24. >>> conn.close()

  

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

小结

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

SQLite

SQLite是一种嵌入式数据库,它的数据库就是一个文件。

由于SQLite本身是C写的,而且体积很小,所以,经常被集成到各种应用程序中,甚至在iOS和Android的App中都可以集成。

Python就内置了SQLite3,所以,在Python中使用SQLite,不需要安装任何东西,直接使用。

在使用SQLite前,我们先要搞清楚几个概念:

表是数据库中存放关系数据的集合,一个数据库里面通常都包含多个表,表和表之间通过外键关联。

要操作关系数据库,首先需要连接到数据库,一个数据库连接称为Connection;

连接到数据库后,需要打开游标,称之为Cursor,通过Cursor执行SQL语句,然后,获得执行结果。

Python定义了一套操作数据库的API接口,任何数据库要连接到Python,只需要提供符合Python标准的数据库驱动即可。

由于SQLite的驱动内置在Python标准库中,所以我们可以直接来操作SQLite数据库。

我们在Python交互式命令行实践一下:

  1. # 导入SQLite驱动:
  2. >>> import sqlite3
  3. # 连接到SQLite数据库
  4. # 数据库文件是test.db
  5. # 如果文件不存在,会自动在当前目录创建:
  6. >>> conn = sqlite3.connect('test.db')
  7. # 创建一个Cursor:
  8. >>> cursor = conn.cursor()
  9. # 执行一条SQL语句,创建user表:
  10. >>> cursor.execute('create table user (id varchar(20) primary key, name varchar(20))')
  11. <sqlite3.Cursor object at 0x10f8aa260>
  12. # 继续执行一条SQL语句,插入一条记录:
  13. >>> cursor.execute('insert into user (id, name) values (\'1\', \'Michael\')')
  14. <sqlite3.Cursor object at 0x10f8aa260>
  15. # 通过rowcount获得插入的行数:
  16. >>> cursor.rowcount
  17. 1
  18. # 关闭Cursor:
  19. >>> cursor.close()
  20. # 提交事务:
  21. >>> conn.commit()
  22. # 关闭Connection:
  23. >>> conn.close()

  

我们再试试查询记录:

  1. >>> conn = sqlite3.connect('test.db')
  2. >>> cursor = conn.cursor()
  3. # 执行查询语句:
  4. >>> cursor.execute('select * from user where id=?', ('1',))
  5. <sqlite3.Cursor object at 0x10f8aa340>
  6. # 获得查询结果集:
  7. >>> values = cursor.fetchall()
  8. >>> values
  9. [('1', 'Michael')]
  10. >>> cursor.close()
  11. >>> conn.close()

使用Python的DB-API时,只要搞清楚Connection和Cursor对象,打开后一定记得关闭,就可以放心地使用。

使用Cursor对象执行insert,update,delete语句时,执行结果由rowcount返回影响的行数,就可以拿到执行结果。

使用Cursor对象执行select语句时,通过fetchall()可以拿到结果集。结果集是一个list,每个元素都是一个tuple,对应一行记录。

如果SQL语句带有参数,那么需要把参数按照位置传递给execute()方法,有几个占位符就必须对应几个参数,例如:

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

SQLite支持常见的标准SQL语句以及几种常见的数据类型。具体文档请参阅SQLite官方网站。

小结

在Python中操作数据库时,要先导入数据库对应的驱动,然后,通过Connection对象和Cursor对象操作数据。

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

真香!Python开发工程师都选择这个数据库:因为它免费的更多相关文章

  1. 珍藏版 Python 开发工程师面试试题

    珍藏版 Python 开发工程师面试试题 说明:不拿到几家公司的offer,那就是卑鄙的浪费 一.Python_基础语法 1.可变与不可变类型: 2.浅拷贝与深拷贝的实现方式.区别:deepcopy如 ...

  2. 《python开发技术详解》|百度网盘免费下载|Python开发入门篇

    <python开发技术详解>|百度网盘免费下载|Python开发入门篇 提取码:2sby  内容简介 Python是目前最流行的动态脚本语言之一.本书共27章,由浅入深.全面系统地介绍了利 ...

  3. Java or Python?测试开发工程师如何选择合适的编程语言?

    很多测试开发工程师尤其是刚入行的同学对编程语言和技术栈选择问题特别关注,毕竟掌握一门编程语言要花不少时间成本,也直接关系到未来的面试和就业(不同企业/项目对技术栈要求也不一样),根据自身情况做一个相对 ...

  4. 面试乐融集团Python开发工程师有感

    这是笔者第一次面试,,乐融集团位于朝阳区朝阳公园的乐融大厦.是下午两点的笔面试,笔者是一点半到的,然后在里面等了会,开始笔试 笔试题并不是太难,就是考的比较宽,因为笔者是校招,所以笔试题出来了数据结构 ...

  5. Java开发工程师(Web方向) - 03.数据库开发 - 第1章.JDBC

    第1章--JDBC JDBC基础 通过Java Database Connectivity可以实现Java程序对后端数据库的访问 一个完整的数据库部署架构,通常是由客户端和服务器端两部分组成 客户端封 ...

  6. php开发工程师都需要掌握什么技能呢?

    PHP原生标准库精通,三种大型框架中熟练掌握一门的开发(Symfony2.Yii.ZF2),小型框架中(Codeigniter 等)通读其一源码. MySQL语句精通,实践构造 1000 万级的数据库 ...

  7. Python开发工程师技术手记

    Python基础篇 PythonPEP8规范 Python历史与安装 Python注释 Python变量以及类型 Python标识符和关键字 Python输出 Python输入 Python运算符 P ...

  8. Java开发工程师(Web方向) - 03.数据库开发 - 第5章.MyBatis

    第5章--MyBatis MyBatis入门 Abstract: 数据库框架的工作原理和使用方法(以MyBatis为例) 面向对象的世界与关系型数据库的鸿沟: 面向对象世界中的数据是对象: 关系型数据 ...

  9. Java开发工程师(Web方向) - 03.数据库开发 - 第4章.事务

    第4章--事务 事务原理与开发 事务Transaction: 什么是事务? 事务是并发控制的基本单位,指作为单个逻辑工作单元执行的一系列操作,且逻辑工作单元需满足ACID特性. i.e. 银行转账:开 ...

随机推荐

  1. 一篇搞懂Java的基本数据类型

    byte 基本类型:byte 包装类:java.lang.Byte 大小:8bit 默认值:0 取值范围:-128~127 Byte.MIN_VALUE Byte.MAX_VALUE 二进制补码表示 ...

  2. Java实现FTP跨服务器文件操作

    在过去的几年工作中,曾经多次需要把文件上传到单独的服务器,而程序是在单独的服务器上部署的,在进行文件操作的时候就需要跨服务器进行操作包括:文件上传.文件下载.文件删除等.跨服务器文件操作一般是需要FT ...

  3. 准备数据集用于flink学习

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  4. tp3.2 前端截取字符串

    在Common目录中建立 function.php <?php function subtext($text, $length) { if(mb_strlen($text, 'utf8') &g ...

  5. 《Python3反爬虫原理与绕过实战》作者韦世东

    可以用(k1,k2)-k1来设置,如果有重复的key,则保留key1,舍弃key2/打印appleMap{1=Apple{id=1,name=苹果1,money=3.25,num=10},2=Appl ...

  6. Spider_实践_beautifulsoup静态网页爬取所有网页链接

    # 获取百度网站首页上的所有a标签里的 href属性值: # import requests # from bs4 import BeautifulSoup # # html = requests.g ...

  7. java版飞机大战代码

    @ 目录 前言 Plane PlaneStatus类 Power类 Gift Diji play类 over类 MainFrame主类 MyZiDan DijiZiDan Before 前言 很久之前 ...

  8. Windows上Jenkins插件下载慢解决方法

    替换文件内容 Jenkins/updates/default.json 替换 updates.jenkins-ci.org/download 为 mirrors.tuna.tsinghua.edu.c ...

  9. LeetCode 中等题解(4)

    40 组合总和 II Question 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates ...

  10. powershell过杀软工具-xencrypt

           在红队攻击中,绕杀软是一个比较常见的技术.对于绕过杀软的方法,有基于黑白名单的,有基于shellloader的,也有基于加密与混淆的.最近在发现了这样一款过杀软的工具,推荐给有缘人,嘻嘻 ...