(十一)Python 数据库的操作

一、访问SQLite数据库

  • SQLite是一个开源关系型数据库,具有零配置(Zero Configuration)、自我包含(Self-contained)和便于传输(Easy Transfer)等优点,由于其高度便携,使用方便、结构紧凑、高效和可靠,因此被广泛用于移动设备嵌入式数据库作为前端数据存储。SQLite支持规范的SQL(Structured Query Language,结构化查询语言),可方便地支持数据库系统原型研发和移植。

  • SQLite将整个数据库的表、索引、数据都存储在一个单一的.db文件中,不需要网络配置和管理,没有用户账户和密码,数据库的访问权限依赖于文件所在的操作系统。这个小型的数据库系统能够支持事务,具有原子性、一致性、隔离性和持久性,还能支持触发器、复杂查询,以及多进程并发访问。

  • 关系型数据库的数据存放于多个二维表中,在表中,行称为记录(record),列称为字段(field)

  • 一个数据库中可以包含多个表。例如,在student.db数据库中除包含基本情况表base外,还包含成绩表score等数据表。各表中都包含一个学号字段,通过学号可以建立两个表乃至多个表之间的关联关系,作为一个逻辑整体提供查询应用。这样,既避免了单个表之间庞大复杂,又增加了引用数据的灵活性,减少了数据的冗余。

  • 1.1、SQLite数据库连接对象及表的SQL操作
    SQLite3是Python的内置库,用import sqlite3 引用后,访问SQLite数据库通常需要经历如下的步骤:

    • connect()创建数据库连接对象conn
    • 若需要对表进行创建新表、插入数据、修改或删除数据操作,可使用conn.execute()方法,并使用conn.commit()提交事务。
    • 若需要查询操作,应先使用conn.cursor()方法返回游标对象 cur,然后通过执行cur.execute()进行查询。
    • 调用cur.fetchone()cur.fetchmany()cur.fetchall()方法返回查询结果。
    • 最后关闭 curconn 对象。

    connect()函数可建立对已有数据库文件的链接对象(下例中的 conn),若不存在该数据库文件,则新建该数据库。例如:在桌面建立一个空数据库:test.db

    屏幕快照 2018-08-29 下午9.54.29.png

    import sqlite3
    conn = sqlite3.connect('/Users/wangchong/Desktop/test.db')
    
    • 由于sqlite3不是可视化呈现的,因此可使用 Navicat for SQLite 、SQLite Expert、SQLite Studio、SQLiteTool等第三方工具协助管理数据库。

    • 建立数据库对象后,用数据库连接对象的 execute (SQL 语句)方法可执行SQL语句,对数据库及表实现创建、插入、修改、删除和查询操作。SQL语句大小写不敏感,可分行,关键字之间可使用空格。在Python字符串的三重引号定符'''的支持下,可将SQL语句分行呈现,增加可读性。

    • 成功创建数据库后,应在其中合理的创建表。表结构的设计是否合理,对程序的运行效率至关重要。设计和创建表,主要应关注表中应包含哪些字段,每个字段的名字、数据类型和宽度。

    • SQLite3的表支持以下4种类型。

      • 整数型(INTEGEER): 有符号整数,按实际存储大小自动存储为1、2、3、4、6或8字节,通常不需要指定位数。
      • 实数型(REAL): 浮点数,以8字节指数形式存储,可指定总位数和小数位数。
      • 文本型(TEXT): 字符串,以数据库编码方式存储(以UTF-8 支持汉字)。
      • BLOB型: 二进制对象存储,通常用来保存图片、视频、XML等数据。

      创建表的语句的通式为:

      CREATE TABLE <表>(<字段元组>)
      

      SQL语句大小写不敏感,但此处为与Python语句相区别,以大写表示。设计表结构时作为一种数据完整性约束,可指定某字段是否允许空,若不允许为空,可用 NOT NULL 关键字加以限制。在大多数表中,往往会指定一个非空且唯一的字段作为关键字(PRIMARY KRY,如学号)。为了便于快速检索,通常将表按主关键字建立索引。

      • 例如1、在桌面建立一个如下的数据库 test.db

        学生基本情况表 base的数据结构

        import sqlite3
        
        conn = sqlite3.connect('/Users/wangchong/Desktop/test.db')
        c = conn.cursor()
        c.execute('''CREATE TABLE base \
           (学号 TEXT(10) PRIMARY KEY  NOT NULL, \
            姓名 TEXT(10) NOT NULL,\
            性别 TEXT(1) NOT NULL,\
            专业 TEXT(6),\
            生源 TEXT(6),\
            身高 INTEGER,\
            电话 TEXT(6) )''')
        conn.commit()
        conn.close()
        

        与数据库链接对象conn.execute()方法相关的常用SQL语句通式如下:

        • 添加:

          INSERT INTO <表>(<字段元组>) VALUES (<数据元组>)
          
          如下:
          import sqlite3
          
          conn = sqlite3.connect('/Users/wangchong/Desktop/test.db')
          c = conn.cursor()
          
          print ("Opened database successfully")
          
          c.execute("INSERT INTO base (学号,姓名,性别,专业,生源,身高,电话) \
                    VALUES ('20','王','男','电气工程及其自动化','本科',178,'18500652890')")
          
          conn.commit()
          print ("Records created successfully")
          conn.close()
          
        • 修改:

          UPDATE <表> SET <字段>=<值>
          
        • 删除:

          DELETE FROM <表> WHERE <条件表达式>
          
      • 例如2、编写Python 程序为例1中创建的student 库的base表添加新学生学号、姓名和性别三项非空数据。

        base表中添加数据

        import sqlite3
        # 链接数据库
        conn = sqlite3.connect('/Users/wangchong/Desktop/test.db')
        while True:
              id = input('请输入新生学号:(输入0退出程序)\n')
              if id == '0':
                   break
              name = input('请输入新生的姓名:\n')
              gender = input('请输入新生的性别:\n')
              # 格式化构建 SQL 字符串
              SQL = '''insert into base \
                      (学号,姓名,性别) values ('%s','%s','%s')''' % (id,name,gender)
              # 插入数据
              conn.execute(SQL)
              # 提交事务
              conn.commit()
        
        conn.close()
        

        运行结果如下:

        请输入新生学号:(输入0退出程序)
        21
        请输入新生的姓名:
        邵豪杰
        请输入新生的性别:
        男
        请输入新生学号:(输入0退出程序)
        22
        请输入新生的姓名:
        马也
        请输入新生的性别:
        女
        请输入新生学号:(输入0退出程序)
        

        在格式化构建SQL字符串时应该注意,values 后面的数据元组应与前面的表达字段元组顺序一直,且TEXT类型的数据要加单引号界定符。

  • 1.2、游标对象和SQL查询

    与游标对象 cur.execute() 方法相关的SQL语句通式为:

    SELECT [DISTINCT] <目标列表表达式> [AS <列名>]
    [,<目标列表达式> [AS <列名> ...] FROM <表名> [,<表名>...]
    [WHERE <条件表达式> [AND | OR <条件表达式>...]
    [GROUP BY 列名 [HAVING  <条件表达式>>
    [ORDER BY 列名 [ASC | DESC>
    

    其中DISTINCT表示不包括重复行;
    <目标列表达式>包含对目标列的 AVG、COUNT、SUM、MIN、MAX等聚合函数;
    <GROUP BY 列名> 为对聚合函数查询的分组;
    [HAVING<条件表达式>] 为分组筛选的条件;
    [ORDER BY 列名 [ASC | DESC>表示对查询结果的排序,ASC 为升序(默认),DESC为降序。
    执行游标对象 cur.execute(<SELECT 查询SQL语句>)后,用 cur.fetchall()或cur.fetchone() 可接收查询结果。其中,cur.fetchall() 返回的是每条记录为 一个元组作为列表元素的数据集列表,而cur.fetchone()则只返回第一条记录的元组类型结果。

    • 例如3、创建Python 程序对前面例子创建的student 库中根据所输入的专业查询学生学号、姓名和性别。


      base表
      import sqlite3
      conn = sqlite3.connect('/Users/wangchong/Desktop/test.db')
      while True:
          major = input('请输入查询专业:(输入0退出程序)\n')
          if major == '0':
              break
          SQL="SELECT * from base where 专业='%s'" % major
          cur = conn.execute(SQL)
          list1=cur.fetchall()
         print('学号 ',' 姓名 ',' 性别 ',' 专业 ')
         for rec in list1:
              print(rec[0],rec[1],rec[2],rec[3])
      
      conn.close()
      

      运行的结果如下:

      请输入查询专业:(输入0退出程序)
      电气工程及其自动化
      学号   姓名   性别   专业 
      20 王冲 男 电气工程及其自动化
      4 李云东 女 电气工程及其自动化
      请输入查询专业:(输入0退出程序)
      

二、访问Access、MySQL 和 SQLServer数据库

Python 可支持访问不同的数据库。但由于不同的数据库及其服务的通信协议各有不同,早期版本访问不同数据库需要不同的代码支持,二Python DB-API作为 Python标准数据库接口的诞生,为Python数据库应用提供了标准的编程接口,支持MySQL 、PostgreSQL、Microsoft SQL Server 、Oracle 、Sybase 等常用数据库。即使所需链接的数据库底层服务协议不同,也能够标准的DB-API 接口实现访问。
利用微软操作系统对各种数据库驱动的开放数据库连接接口(ODBC,Open Database Connecttivity) 也可以实现对数据库的标准访问。通过标准的 DB-API 访问各类数据库通常如上节访问 SQLite 一样,也需经历如下步骤:

 1、用connect创建数据库连接对象 conn;
 2、如果需要对表进行创建、插入数据、修改或删除数据、可使用 conn.execute()方法,并使用conn.commit()提交事务。
 3、如果需要查询操作,应先使用 conn.cursor()方法返回游标对象 cur,然后通过执行 cur.execute()进行查询。
 4、调用 cur.fetchone()、cur.fetchmany()或cur.fetchall()方法返回查询结果。
 其中,对不同类型的数据库需要引用不同的标准库,用不同的语句创建链接对象。
  • 2.1、用 ODBC 创建链接对象
    对 Access 数据库文件的访问,利用 Windows开放数据库连接接口 ODBC 对文件、dBase、Foxpro、SQL Server 等微软数据库的访问,均可预先在控制面板中建立 ODBC 数据源,如下:


    ODBC数据源

    预先安装 pyodbc 库 ,然后用下列语句建立数据库连接对象:

    import pyodbc
    conn= pyodbc.connect('DNS=student')
    
  • 2.2、对 MySQL 创建链接对象
    MySQL 数据库是近来流行的开源关系型数据库服务,对其建立连接对象可预先安装 PyMySQL库,然后用下列语句创建:

    import pymysql
    conn= pymysql.connect(host=服务器地址或域名,port=3306,user='root',passwd=密码,db=数据库名字)
    
  • 2.3、对 MS SQL Server 创建链接对象
    MS SQL Server 数据库是微软主流的大型关系型数据库服务,对其建立连接对象可预先安装 pymssql 库 ,然后用下列语句创建:

    import pymssql
    conn= pymssql.connect(host=<服务器地址或域名>,database=<数据库名>,user=<用户名>,password=<密码>)
    

    数据库连接对象建立后,对各类数据库的访问操作方法均与前面介绍的对SQLite的访问操作类似。这里不再重复叙述。值的注意的是,由于目前各类数据库的编码不统一,因此对中文查询的支持尚不够理想。

  • 例如4、用Python 程序分别在 ODBC 链接的 student.db、MySQL数据库 student(数据库地址 192.168.145.253,root 密码为test) 和 MS SQL Server 数据库 student (数据库地址 192.168.145.253,sa 密码为 123456)的base表中,查询身高(height)181cm以上的学生学号、姓名和性别。

    # 1、用 obdc 连接数据库(Access 等)
    # import pyodbc
    # conn=pyodbc.connect('DNS=student')
    
    # 2、连接 MySQL 数据库  
    import pymysql         
    conn=pymysql.connect(host='192.168.145.253',port=3306,user='root',passwd='test',db='base')
    
    # 3、连接 MS SQL Server  数据库
    
    # import pymssql
    # conn=pymssql.connect(host=".",database="student",user='sa',password='123456')
    
    cur = conn.cursor()
    cur.execute("SELECT * FROM BASE WHERE HEIGHT>181")
    list1=cur.fetchall()
    print('学号 ',' 姓名 ',' 性别 ',' 专业')
    for rec in list1:
       print(rec[0],rec[1],rec[2],rec[3])
    conn.close()
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容

  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 31,789评论 2 89
  • 1.数据库简介 人类在进化的过程中,创造了数字、文字、符号等来进行数据的记录,但是承受着认知能力和创造能力的提升,...
    大熊_7d48阅读 464评论 0 1
  • 总有想不出穿什么的时候,建议可以选择连衣裙哦,不用费心搭配,穿好了还能修饰身形,真的是非常棒的单品呢。连衣裙真的是...
    shaohua小鱼阅读 187评论 0 0
  • WWH=Why-What-How 即 为了Why,我们要做What,怎么做How。 例如 为了提升我的业务技能竞争...
    穆璃阅读 210评论 0 0
  • 文/熠歆
    熠歆阅读 161评论 12 2