Python开发SQLite3数据库相关操作详解【连接,查询,插入,更新,删除,关闭等】


Posted in Python onJuly 27, 2017

本文实例讲述了Python开发SQLite3数据库相关操作。分享给大家供大家参考,具体如下:

'''SQLite数据库是一款非常小巧的嵌入式开源数据库软件,也就是说
没有独立的维护进程,所有的维护都来自于程序本身。
在python中,使用sqlite3创建数据库的连接,当我们指定的数据库文件不存在的时候
连接对象会自动创建数据库文件;如果数据库文件已经存在,则连接对象不会再创建
数据库文件,而是直接打开该数据库文件。
  连接对象可以是硬盘上面的数据库文件,也可以是建立在内存中的,在内存中的数据库
  执行完任何操作后,都不需要提交事务的(commit)
  创建在硬盘上面: conn = sqlite3.connect('c:\\test\\test.db')
  创建在内存上面: conn = sqlite3.connect('"memory:')
  下面我们一硬盘上面创建数据库文件为例来具体说明:
  conn = sqlite3.connect('c:\\test\\hongten.db')
  其中conn对象是数据库链接对象,而对于数据库链接对象来说,具有以下操作:
    commit()      --事务提交
    rollback()     --事务回滚
    close()       --关闭一个数据库链接
    cursor()      --创建一个游标
  cu = conn.cursor()
  这样我们就创建了一个游标对象:cu
  在sqlite3中,所有sql语句的执行都要在游标对象的参与下完成
  对于游标对象cu,具有以下具体操作:
    execute()      --执行一条sql语句
    executemany()    --执行多条sql语句
    close()       --游标关闭
    fetchone()     --从结果中取出一条记录
    fetchmany()     --从结果中取出多条记录
    fetchall()     --从结果中取出所有记录
    scroll()      --游标滚动
'''

下面是我做的demo,在demo中,我做了很详细的注释和功能的演示,详情如下:

SHOW_SQL = False的时候:

Python 3.3.2 (v3.3.2:d047928ae3f6, May 16 2013, 00:03:43) [MSC v.1600 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>> 
show_sql : False
删除数据库表测试...
硬盘上面:[c:\test\hongten.db]
删除数据库表[student]成功!
创建数据库表测试...
硬盘上面:[c:\test\hongten.db]
创建数据库表[student]成功!
保存数据测试...
硬盘上面:[c:\test\hongten.db]
查询所有数据...
硬盘上面:[c:\test\hongten.db]
(1, 'Hongten', '男', 20, '广东省广州市', '13423****62')
(2, 'Tom', '男', 22, '美国旧金山', '15423****63')
(3, 'Jake', '女', 18, '广东省广州市', '18823****87')
(4, 'Cate', '女', 21, '广东省广州市', '14323****32')
##################################################
查询一条数据...
硬盘上面:[c:\test\hongten.db]
(1, 'Hongten', '男', 20, '广东省广州市', '13423****62')
##################################################
更新数据...
硬盘上面:[c:\test\hongten.db]
查询所有数据...
硬盘上面:[c:\test\hongten.db]
(1, 'HongtenAA', '男', 20, '广东省广州市', '13423****62')
(2, 'HongtenBB', '男', 22, '美国旧金山', '15423****63')
(3, 'HongtenCC', '女', 18, '广东省广州市', '18823****87')
(4, 'HongtenDD', '女', 21, '广东省广州市', '14323****32')
##################################################
删除数据...
硬盘上面:[c:\test\hongten.db]
查询所有数据...
硬盘上面:[c:\test\hongten.db]
(2, 'HongtenBB', '男', 22, '美国旧金山', '15423****63')
(4, 'HongtenDD', '女', 21, '广东省广州市', '14323****32')
>>>

SHOW_SQL = True的时候:

Python 3.3.2 (v3.3.2:d047928ae3f6, May 16 2013, 00:03:43) [MSC v.1600 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>> 
show_sql : True
删除数据库表测试...
硬盘上面:[c:\test\hongten.db]
执行sql:[DROP TABLE IF EXISTS student]
删除数据库表[student]成功!
创建数据库表测试...
硬盘上面:[c:\test\hongten.db]
执行sql:[CREATE TABLE `student` (
             `id` int(11) NOT NULL,
             `name` varchar(20) NOT NULL,
             `gender` varchar(4) DEFAULT NULL,
             `age` int(11) DEFAULT NULL,
             `address` varchar(200) DEFAULT NULL,
             `phone` varchar(20) DEFAULT NULL,
              PRIMARY KEY (`id`)
            )]
创建数据库表[student]成功!
保存数据测试...
硬盘上面:[c:\test\hongten.db]
执行sql:[INSERT INTO student values (?, ?, ?, ?, ?, ?)],参数:[(1, 'Hongten', '男', 20, '广东省广州市', '13423****62')]
执行sql:[INSERT INTO student values (?, ?, ?, ?, ?, ?)],参数:[(2, 'Tom', '男', 22, '美国旧金山', '15423****63')]
执行sql:[INSERT INTO student values (?, ?, ?, ?, ?, ?)],参数:[(3, 'Jake', '女', 18, '广东省广州市', '18823****87')]
执行sql:[INSERT INTO student values (?, ?, ?, ?, ?, ?)],参数:[(4, 'Cate', '女', 21, '广东省广州市', '14323****32')]
查询所有数据...
硬盘上面:[c:\test\hongten.db]
执行sql:[SELECT * FROM student]
(1, 'Hongten', '男', 20, '广东省广州市', '13423****62')
(2, 'Tom', '男', 22, '美国旧金山', '15423****63')
(3, 'Jake', '女', 18, '广东省广州市', '18823****87')
(4, 'Cate', '女', 21, '广东省广州市', '14323****32')
##################################################
查询一条数据...
硬盘上面:[c:\test\hongten.db]
执行sql:[SELECT * FROM student WHERE ID = ? ],参数:[1]
(1, 'Hongten', '男', 20, '广东省广州市', '13423****62')
##################################################
更新数据...
硬盘上面:[c:\test\hongten.db]
执行sql:[UPDATE student SET name = ? WHERE ID = ? ],参数:[('HongtenAA', 1)]
执行sql:[UPDATE student SET name = ? WHERE ID = ? ],参数:[('HongtenBB', 2)]
执行sql:[UPDATE student SET name = ? WHERE ID = ? ],参数:[('HongtenCC', 3)]
执行sql:[UPDATE student SET name = ? WHERE ID = ? ],参数:[('HongtenDD', 4)]
查询所有数据...
硬盘上面:[c:\test\hongten.db]
执行sql:[SELECT * FROM student]
(1, 'HongtenAA', '男', 20, '广东省广州市', '13423****62')
(2, 'HongtenBB', '男', 22, '美国旧金山', '15423****63')
(3, 'HongtenCC', '女', 18, '广东省广州市', '18823****87')
(4, 'HongtenDD', '女', 21, '广东省广州市', '14323****32')
##################################################
删除数据...
硬盘上面:[c:\test\hongten.db]
执行sql:[DELETE FROM student WHERE NAME = ? AND ID = ? ],参数:[('HongtenAA', 1)]
执行sql:[DELETE FROM student WHERE NAME = ? AND ID = ? ],参数:[('HongtenCC', 3)]
查询所有数据...
硬盘上面:[c:\test\hongten.db]
执行sql:[SELECT * FROM student]
(2, 'HongtenBB', '男', 22, '美国旧金山', '15423****63')
(4, 'HongtenDD', '女', 21, '广东省广州市', '14323****32')
>>>

具体代码:

#python sqlite
#Author : Hongten
#Create : 2013-08-09
#Version: 1.0
#DB-API 2.0 interface for SQLite databases
import sqlite3
import os
'''SQLite数据库是一款非常小巧的嵌入式开源数据库软件,也就是说
没有独立的维护进程,所有的维护都来自于程序本身。
在python中,使用sqlite3创建数据库的连接,当我们指定的数据库文件不存在的时候
连接对象会自动创建数据库文件;如果数据库文件已经存在,则连接对象不会再创建
数据库文件,而是直接打开该数据库文件。
  连接对象可以是硬盘上面的数据库文件,也可以是建立在内存中的,在内存中的数据库
  执行完任何操作后,都不需要提交事务的(commit)
  创建在硬盘上面: conn = sqlite3.connect('c:\\test\\test.db')
  创建在内存上面: conn = sqlite3.connect('"memory:')
  下面我们一硬盘上面创建数据库文件为例来具体说明:
  conn = sqlite3.connect('c:\\test\\hongten.db')
  其中conn对象是数据库链接对象,而对于数据库链接对象来说,具有以下操作:
    commit()      --事务提交
    rollback()     --事务回滚
    close()       --关闭一个数据库链接
    cursor()      --创建一个游标
  cu = conn.cursor()
  这样我们就创建了一个游标对象:cu
  在sqlite3中,所有sql语句的执行都要在游标对象的参与下完成
  对于游标对象cu,具有以下具体操作:
    execute()      --执行一条sql语句
    executemany()    --执行多条sql语句
    close()       --游标关闭
    fetchone()     --从结果中取出一条记录
    fetchmany()     --从结果中取出多条记录
    fetchall()     --从结果中取出所有记录
    scroll()      --游标滚动
'''
#global var
#数据库文件绝句路径
DB_FILE_PATH = ''
#表名称
TABLE_NAME = ''
#是否打印sql
SHOW_SQL = True
def get_conn(path):
  '''获取到数据库的连接对象,参数为数据库文件的绝对路径
  如果传递的参数是存在,并且是文件,那么就返回硬盘上面改
  路径下的数据库文件的连接对象;否则,返回内存中的数据接
  连接对象'''
  conn = sqlite3.connect(path)
  if os.path.exists(path) and os.path.isfile(path):
    print('硬盘上面:[{}]'.format(path))
    return conn
  else:
    conn = None
    print('内存上面:[:memory:]')
    return sqlite3.connect(':memory:')
def get_cursor(conn):
  '''该方法是获取数据库的游标对象,参数为数据库的连接对象
  如果数据库的连接对象不为None,则返回数据库连接对象所创
  建的游标对象;否则返回一个游标对象,该对象是内存中数据
  库连接对象所创建的游标对象'''
  if conn is not None:
    return conn.cursor()
  else:
    return get_conn('').cursor()
###############################################################
####      创建|删除表操作   START
###############################################################
def drop_table(conn, table):
  '''如果表存在,则删除表,如果表中存在数据的时候,使用该
  方法的时候要慎用!'''
  if table is not None and table != '':
    sql = 'DROP TABLE IF EXISTS ' + table
    if SHOW_SQL:
      print('执行sql:[{}]'.format(sql))
    cu = get_cursor(conn)
    cu.execute(sql)
    conn.commit()
    print('删除数据库表[{}]成功!'.format(table))
    close_all(conn, cu)
  else:
    print('the [{}] is empty or equal None!'.format(sql))
def create_table(conn, sql):
  '''创建数据库表:student'''
  if sql is not None and sql != '':
    cu = get_cursor(conn)
    if SHOW_SQL:
      print('执行sql:[{}]'.format(sql))
    cu.execute(sql)
    conn.commit()
    print('创建数据库表[student]成功!')
    close_all(conn, cu)
  else:
    print('the [{}] is empty or equal None!'.format(sql))
###############################################################
####      创建|删除表操作   END
###############################################################
def close_all(conn, cu):
  '''关闭数据库游标对象和数据库连接对象'''
  try:
    if cu is not None:
      cu.close()
  finally:
    if cu is not None:
      cu.close()
###############################################################
####      数据库操作CRUD   START
###############################################################
def save(conn, sql, data):
  '''插入数据'''
  if sql is not None and sql != '':
    if data is not None:
      cu = get_cursor(conn)
      for d in data:
        if SHOW_SQL:
          print('执行sql:[{}],参数:[{}]'.format(sql, d))
        cu.execute(sql, d)
        conn.commit()
      close_all(conn, cu)
  else:
    print('the [{}] is empty or equal None!'.format(sql))
def fetchall(conn, sql):
  '''查询所有数据'''
  if sql is not None and sql != '':
    cu = get_cursor(conn)
    if SHOW_SQL:
      print('执行sql:[{}]'.format(sql))
    cu.execute(sql)
    r = cu.fetchall()
    if len(r) > 0:
      for e in range(len(r)):
        print(r[e])
  else:
    print('the [{}] is empty or equal None!'.format(sql)) 
def fetchone(conn, sql, data):
  '''查询一条数据'''
  if sql is not None and sql != '':
    if data is not None:
      #Do this instead
      d = (data,) 
      cu = get_cursor(conn)
      if SHOW_SQL:
        print('执行sql:[{}],参数:[{}]'.format(sql, data))
      cu.execute(sql, d)
      r = cu.fetchall()
      if len(r) > 0:
        for e in range(len(r)):
          print(r[e])
    else:
      print('the [{}] equal None!'.format(data))
  else:
    print('the [{}] is empty or equal None!'.format(sql))
def update(conn, sql, data):
  '''更新数据'''
  if sql is not None and sql != '':
    if data is not None:
      cu = get_cursor(conn)
      for d in data:
        if SHOW_SQL:
          print('执行sql:[{}],参数:[{}]'.format(sql, d))
        cu.execute(sql, d)
        conn.commit()
      close_all(conn, cu)
  else:
    print('the [{}] is empty or equal None!'.format(sql))
def delete(conn, sql, data):
  '''删除数据'''
  if sql is not None and sql != '':
    if data is not None:
      cu = get_cursor(conn)
      for d in data:
        if SHOW_SQL:
          print('执行sql:[{}],参数:[{}]'.format(sql, d))
        cu.execute(sql, d)
        conn.commit()
      close_all(conn, cu)
  else:
    print('the [{}] is empty or equal None!'.format(sql))
###############################################################
####      数据库操作CRUD   END
###############################################################
###############################################################
####      测试操作   START
###############################################################
def drop_table_test():
  '''删除数据库表测试'''
  print('删除数据库表测试...')
  conn = get_conn(DB_FILE_PATH)
  drop_table(conn, TABLE_NAME)
def create_table_test():
  '''创建数据库表测试'''
  print('创建数据库表测试...')
  create_table_sql = '''CREATE TABLE `student` (
             `id` int(11) NOT NULL,
             `name` varchar(20) NOT NULL,
             `gender` varchar(4) DEFAULT NULL,
             `age` int(11) DEFAULT NULL,
             `address` varchar(200) DEFAULT NULL,
             `phone` varchar(20) DEFAULT NULL,
              PRIMARY KEY (`id`)
            )'''
  conn = get_conn(DB_FILE_PATH)
  create_table(conn, create_table_sql)
def save_test():
  '''保存数据测试...'''
  print('保存数据测试...')
  save_sql = '''INSERT INTO student values (?, ?, ?, ?, ?, ?)'''
  data = [(1, 'Hongten', '男', 20, '广东省广州市', '13423****62'),
      (2, 'Tom', '男', 22, '美国旧金山', '15423****63'),
      (3, 'Jake', '女', 18, '广东省广州市', '18823****87'),
      (4, 'Cate', '女', 21, '广东省广州市', '14323****32')]
  conn = get_conn(DB_FILE_PATH)
  save(conn, save_sql, data)
def fetchall_test():
  '''查询所有数据...'''
  print('查询所有数据...')
  fetchall_sql = '''SELECT * FROM student'''
  conn = get_conn(DB_FILE_PATH)
  fetchall(conn, fetchall_sql)
def fetchone_test():
  '''查询一条数据...'''
  print('查询一条数据...')
  fetchone_sql = 'SELECT * FROM student WHERE ID = ? '
  data = 1
  conn = get_conn(DB_FILE_PATH)
  fetchone(conn, fetchone_sql, data)
def update_test():
  '''更新数据...'''
  print('更新数据...')
  update_sql = 'UPDATE student SET name = ? WHERE ID = ? '
  data = [('HongtenAA', 1),
      ('HongtenBB', 2),
      ('HongtenCC', 3),
      ('HongtenDD', 4)]
  conn = get_conn(DB_FILE_PATH)
  update(conn, update_sql, data)
def delete_test():
  '''删除数据...'''
  print('删除数据...')
  delete_sql = 'DELETE FROM student WHERE NAME = ? AND ID = ? '
  data = [('HongtenAA', 1),
      ('HongtenCC', 3)]
  conn = get_conn(DB_FILE_PATH)
  delete(conn, delete_sql, data)
###############################################################
####      测试操作   END
###############################################################
def init():
  '''初始化方法'''
  #数据库文件绝句路径
  global DB_FILE_PATH
  DB_FILE_PATH = 'c:\\test\\hongten.db'
  #数据库表名称
  global TABLE_NAME
  TABLE_NAME = 'student'
  #是否打印sql
  global SHOW_SQL
  SHOW_SQL = True
  print('show_sql : {}'.format(SHOW_SQL))
  #如果存在数据库表,则删除表
  drop_table_test()
  #创建数据库表student
  create_table_test()
  #向数据库表中插入数据
  save_test()
def main():
  init()
  fetchall_test()
  print('#' * 50)
  fetchone_test()
  print('#' * 50)
  update_test()
  fetchall_test()
  print('#' * 50)
  delete_test()
  fetchall_test()
if __name__ == '__main__':
  main()

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
深度剖析使用python抓取网页正文的源码
Jun 11 Python
Python中获取网页状态码的两个方法
Nov 03 Python
python删除过期文件的方法
May 29 Python
Python的Twisted框架上手前所必须了解的异步编程思想
May 25 Python
在python中实现对list求和及求积
Nov 14 Python
详解Python odoo中嵌入html简单的分页功能
May 29 Python
解决python执行不输出系统命令弹框的问题
Jun 24 Python
python 串口读取+存储+输出处理实例
Dec 26 Python
python GUI库图形界面开发之PyQt5布局控件QVBoxLayout详细使用方法与实例
Mar 06 Python
如何在sublime编辑器中安装python
May 20 Python
python3检查字典传入函数键是否齐全的实例
Jun 05 Python
anaconda python3.8安装后降级
Jun 11 Python
Python基于tkinter模块实现的改名小工具示例
Jul 27 #Python
python django 增删改查操作 数据库Mysql
Jul 27 #Python
Python中Selenium模拟JQuery滑动解锁实例
Jul 26 #Python
Python列表和元组的定义与使用操作示例
Jul 26 #Python
老生常谈Python之装饰器、迭代器和生成器
Jul 26 #Python
python基础之入门必看操作
Jul 26 #Python
Python简单定义与使用字典dict的方法示例
Jul 25 #Python
You might like
默默小谈PHP&MYSQL分页原理及实现
2007/01/02 PHP
thinkPHP简单实现多个子查询语句的方法
2016/12/05 PHP
jquery自定义下拉列表示例
2014/04/25 Javascript
Javascript实现单张图片浏览
2014/12/18 Javascript
javaScript中Math()函数注意事项
2015/06/18 Javascript
JavaScript实现动态删除列表框值的方法
2015/08/12 Javascript
jQuery简单实现两级下拉菜单效果代码
2015/09/15 Javascript
javascript实现动态统计图开发实例
2015/11/21 Javascript
javascript HTML5 Canvas实现圆盘抽奖功能
2016/04/11 Javascript
JavaScript实现窗口抖动效果
2016/10/19 Javascript
vue2.0的虚拟DOM渲染思路分析
2018/08/09 Javascript
js使用swiper实现层叠轮播效果实例代码
2018/12/12 Javascript
微信小程序实现banner图轮播效果
2020/06/28 Javascript
使用mixins实现elementUI表单全局验证的解决方法
2019/04/02 Javascript
iSlider手机端图片滑动切换插件使用详解
2019/12/24 Javascript
小程序实现多个选项卡切换
2020/06/19 Javascript
微信小程序对图片进行canvas压缩的方法示例详解
2020/11/12 Javascript
[37:22]DOTA2上海特级锦标赛D组资格赛#2 Liquid VS VP第一局
2016/02/28 DOTA
[46:50]Liquid vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
使用Python构建Hopfield网络的教程
2015/04/14 Python
使用Python脚本操作MongoDB的教程
2015/04/16 Python
Python学习笔记之解析json的方法分析
2017/04/21 Python
Python实现直方图均衡基本原理解析
2019/08/08 Python
Python 使用 PyQt5 开发的关机小工具分享
2020/07/16 Python
python 多线程死锁问题的解决方案
2020/08/25 Python
基于python爬取链家二手房信息代码示例
2020/10/21 Python
最新PyCharm 2020.2.3永久激活码(亲测有效)
2020/11/26 Python
python os.rename实例用法详解
2020/12/06 Python
python 基于selenium实现鼠标拖拽功能
2020/12/24 Python
信息部岗位职责
2013/11/12 职场文书
2014年五四青年节演讲稿范文
2014/04/22 职场文书
公司领导班子对照检查材料
2014/09/24 职场文书
群众路线对照检查剖析材料
2014/10/09 职场文书
护士业务学习心得体会
2016/01/25 职场文书
2019年教师节祝福语精选,给老师送上真诚的祝福
2019/09/09 职场文书
Nest.js参数校验和自定义返回数据格式详解
2021/03/29 Javascript