• (转)python 开发 sqlite 绝对完整


    '''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:	esthongten.db]
    删除数据库表[student]成功!
    创建数据库表测试...
    硬盘上面:[c:	esthongten.db]
    创建数据库表[student]成功!
    保存数据测试...
    硬盘上面:[c:	esthongten.db]
    查询所有数据...
    硬盘上面:[c:	esthongten.db]
    (1, 'Hongten', '男', 20, '广东省广州市', '13423****62')
    (2, 'Tom', '男', 22, '美国旧金山', '15423****63')
    (3, 'Jake', '女', 18, '广东省广州市', '18823****87')
    (4, 'Cate', '女', 21, '广东省广州市', '14323****32')
    ##################################################
    查询一条数据...
    硬盘上面:[c:	esthongten.db]
    (1, 'Hongten', '男', 20, '广东省广州市', '13423****62')
    ##################################################
    更新数据...
    硬盘上面:[c:	esthongten.db]
    查询所有数据...
    硬盘上面:[c:	esthongten.db]
    (1, 'HongtenAA', '男', 20, '广东省广州市', '13423****62')
    (2, 'HongtenBB', '男', 22, '美国旧金山', '15423****63')
    (3, 'HongtenCC', '女', 18, '广东省广州市', '18823****87')
    (4, 'HongtenDD', '女', 21, '广东省广州市', '14323****32')
    ##################################################
    删除数据...
    硬盘上面:[c:	esthongten.db]
    查询所有数据...
    硬盘上面:[c:	esthongten.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:	esthongten.db]
    执行sql:[DROP TABLE IF EXISTS student]
    删除数据库表[student]成功!
    创建数据库表测试...
    硬盘上面:[c:	esthongten.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:	esthongten.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:	esthongten.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:	esthongten.db]
    执行sql:[SELECT * FROM student WHERE ID = ? ],参数:[1]
    (1, 'Hongten', '男', 20, '广东省广州市', '13423****62')
    ##################################################
    更新数据...
    硬盘上面:[c:	esthongten.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:	esthongten.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:	esthongten.db]
    执行sql:[DELETE FROM student WHERE NAME = ? AND ID = ? ],参数:[('HongtenAA', 1)]
    执行sql:[DELETE FROM student WHERE NAME = ? AND ID = ? ],参数:[('HongtenCC', 3)]
    查询所有数据...
    硬盘上面:[c:	esthongten.db]
    执行sql:[SELECT * FROM student]
    (2, 'HongtenBB', '男', 22, '美国旧金山', '15423****63')
    (4, 'HongtenDD', '女', 21, '广东省广州市', '14323****32')
    >>> 
    复制代码

    =========================================

    具体代码:

    =========================================

    复制代码
      1 #python sqlite
      2 
      3 #Author : Hongten
      4 #MailTo : hongtenzone@foxmail.com
      5 #QQ     : 648719819
      6 #Blog   : http://www.cnblogs.com/hongten
      7 #Create : 2013-08-09
      8 #Version: 1.0
      9 
     10 #DB-API 2.0 interface for SQLite databases
     11 
     12 import sqlite3
     13 import os
     14 '''SQLite数据库是一款非常小巧的嵌入式开源数据库软件,也就是说
     15 没有独立的维护进程,所有的维护都来自于程序本身。
     16 在python中,使用sqlite3创建数据库的连接,当我们指定的数据库文件不存在的时候
     17 连接对象会自动创建数据库文件;如果数据库文件已经存在,则连接对象不会再创建
     18 数据库文件,而是直接打开该数据库文件。
     19     连接对象可以是硬盘上面的数据库文件,也可以是建立在内存中的,在内存中的数据库
     20     执行完任何操作后,都不需要提交事务的(commit)
     21 
     22     创建在硬盘上面: conn = sqlite3.connect('c:\test\test.db')
     23     创建在内存上面: conn = sqlite3.connect('"memory:')
     24 
     25     下面我们一硬盘上面创建数据库文件为例来具体说明:
     26     conn = sqlite3.connect('c:\test\hongten.db')
     27     其中conn对象是数据库链接对象,而对于数据库链接对象来说,具有以下操作:
     28 
     29         commit()            --事务提交
     30         rollback()          --事务回滚
     31         close()             --关闭一个数据库链接
     32         cursor()            --创建一个游标
     33 
     34     cu = conn.cursor()
     35     这样我们就创建了一个游标对象:cu
     36     在sqlite3中,所有sql语句的执行都要在游标对象的参与下完成
     37     对于游标对象cu,具有以下具体操作:
     38 
     39         execute()           --执行一条sql语句
     40         executemany()       --执行多条sql语句
     41         close()             --游标关闭
     42         fetchone()          --从结果中取出一条记录
     43         fetchmany()         --从结果中取出多条记录
     44         fetchall()          --从结果中取出所有记录
     45         scroll()            --游标滚动
     46 
     47 '''
     48 
     49 #global var
     50 #数据库文件绝句路径
     51 DB_FILE_PATH = ''
     52 #表名称
     53 TABLE_NAME = ''
     54 #是否打印sql
     55 SHOW_SQL = True
     56 
     57 def get_conn(path):
     58     '''获取到数据库的连接对象,参数为数据库文件的绝对路径
     59     如果传递的参数是存在,并且是文件,那么就返回硬盘上面改
     60     路径下的数据库文件的连接对象;否则,返回内存中的数据接
     61     连接对象'''
     62     conn = sqlite3.connect(path)
     63     if os.path.exists(path) and os.path.isfile(path):
     64         print('硬盘上面:[{}]'.format(path))
     65         return conn
     66     else:
     67         conn = None
     68         print('内存上面:[:memory:]')
     69         return sqlite3.connect(':memory:')
     70 
     71 def get_cursor(conn):
     72     '''该方法是获取数据库的游标对象,参数为数据库的连接对象
     73     如果数据库的连接对象不为None,则返回数据库连接对象所创
     74     建的游标对象;否则返回一个游标对象,该对象是内存中数据
     75     库连接对象所创建的游标对象'''
     76     if conn is not None:
     77         return conn.cursor()
     78     else:
     79         return get_conn('').cursor()
     80 
     81 ###############################################################
     82 ####            创建|删除表操作     START
     83 ###############################################################
     84 def drop_table(conn, table):
     85     '''如果表存在,则删除表,如果表中存在数据的时候,使用该
     86     方法的时候要慎用!'''
     87     if table is not None and table != '':
     88         sql = 'DROP TABLE IF EXISTS ' + table
     89         if SHOW_SQL:
     90             print('执行sql:[{}]'.format(sql))
     91         cu = get_cursor(conn)
     92         cu.execute(sql)
     93         conn.commit()
     94         print('删除数据库表[{}]成功!'.format(table))
     95         close_all(conn, cu)
     96     else:
     97         print('the [{}] is empty or equal None!'.format(sql))
     98 
     99 def create_table(conn, sql):
    100     '''创建数据库表:student'''
    101     if sql is not None and sql != '':
    102         cu = get_cursor(conn)
    103         if SHOW_SQL:
    104             print('执行sql:[{}]'.format(sql))
    105         cu.execute(sql)
    106         conn.commit()
    107         print('创建数据库表[student]成功!')
    108         close_all(conn, cu)
    109     else:
    110         print('the [{}] is empty or equal None!'.format(sql))
    111 
    112 ###############################################################
    113 ####            创建|删除表操作     END
    114 ###############################################################
    115 
    116 def close_all(conn, cu):
    117     '''关闭数据库游标对象和数据库连接对象'''
    118     try:
    119         if cu is not None:
    120             cu.close()
    121     finally:
    122         if cu is not None:
    123             cu.close()
    124 
    125 ###############################################################
    126 ####            数据库操作CRUD     START
    127 ###############################################################
    128 
    129 def save(conn, sql, data):
    130     '''插入数据'''
    131     if sql is not None and sql != '':
    132         if data is not None:
    133             cu = get_cursor(conn)
    134             for d in data:
    135                 if SHOW_SQL:
    136                     print('执行sql:[{}],参数:[{}]'.format(sql, d))
    137                 cu.execute(sql, d)
    138                 conn.commit()
    139             close_all(conn, cu)
    140     else:
    141         print('the [{}] is empty or equal None!'.format(sql))
    142 
    143 def fetchall(conn, sql):
    144     '''查询所有数据'''
    145     if sql is not None and sql != '':
    146         cu = get_cursor(conn)
    147         if SHOW_SQL:
    148             print('执行sql:[{}]'.format(sql))
    149         cu.execute(sql)
    150         r = cu.fetchall()
    151         if len(r) > 0:
    152             for e in range(len(r)):
    153                 print(r[e])
    154     else:
    155         print('the [{}] is empty or equal None!'.format(sql)) 
    156 
    157 def fetchone(conn, sql, data):
    158     '''查询一条数据'''
    159     if sql is not None and sql != '':
    160         if data is not None:
    161             #Do this instead
    162             d = (data,) 
    163             cu = get_cursor(conn)
    164             if SHOW_SQL:
    165                 print('执行sql:[{}],参数:[{}]'.format(sql, data))
    166             cu.execute(sql, d)
    167             r = cu.fetchall()
    168             if len(r) > 0:
    169                 for e in range(len(r)):
    170                     print(r[e])
    171         else:
    172             print('the [{}] equal None!'.format(data))
    173     else:
    174         print('the [{}] is empty or equal None!'.format(sql))
    175 
    176 def update(conn, sql, data):
    177     '''更新数据'''
    178     if sql is not None and sql != '':
    179         if data is not None:
    180             cu = get_cursor(conn)
    181             for d in data:
    182                 if SHOW_SQL:
    183                     print('执行sql:[{}],参数:[{}]'.format(sql, d))
    184                 cu.execute(sql, d)
    185                 conn.commit()
    186             close_all(conn, cu)
    187     else:
    188         print('the [{}] is empty or equal None!'.format(sql))
    189 
    190 def delete(conn, sql, data):
    191     '''删除数据'''
    192     if sql is not None and sql != '':
    193         if data is not None:
    194             cu = get_cursor(conn)
    195             for d in data:
    196                 if SHOW_SQL:
    197                     print('执行sql:[{}],参数:[{}]'.format(sql, d))
    198                 cu.execute(sql, d)
    199                 conn.commit()
    200             close_all(conn, cu)
    201     else:
    202         print('the [{}] is empty or equal None!'.format(sql))
    203 ###############################################################
    204 ####            数据库操作CRUD     END
    205 ###############################################################
    206 
    207 
    208 ###############################################################
    209 ####            测试操作     START
    210 ###############################################################
    211 def drop_table_test():
    212     '''删除数据库表测试'''
    213     print('删除数据库表测试...')
    214     conn = get_conn(DB_FILE_PATH)
    215     drop_table(conn, TABLE_NAME)
    216 
    217 def create_table_test():
    218     '''创建数据库表测试'''
    219     print('创建数据库表测试...')
    220     create_table_sql = '''CREATE TABLE `student` (
    221                           `id` int(11) NOT NULL,
    222                           `name` varchar(20) NOT NULL,
    223                           `gender` varchar(4) DEFAULT NULL,
    224                           `age` int(11) DEFAULT NULL,
    225                           `address` varchar(200) DEFAULT NULL,
    226                           `phone` varchar(20) DEFAULT NULL,
    227                            PRIMARY KEY (`id`)
    228                         )'''
    229     conn = get_conn(DB_FILE_PATH)
    230     create_table(conn, create_table_sql)
    231 
    232 def save_test():
    233     '''保存数据测试...'''
    234     print('保存数据测试...')
    235     save_sql = '''INSERT INTO student values (?, ?, ?, ?, ?, ?)'''
    236     data = [(1, 'Hongten', '男', 20, '广东省广州市', '13423****62'),
    237             (2, 'Tom', '男', 22, '美国旧金山', '15423****63'),
    238             (3, 'Jake', '女', 18, '广东省广州市', '18823****87'),
    239             (4, 'Cate', '女', 21, '广东省广州市', '14323****32')]
    240     conn = get_conn(DB_FILE_PATH)
    241     save(conn, save_sql, data)
    242 
    243 def fetchall_test():
    244     '''查询所有数据...'''
    245     print('查询所有数据...')
    246     fetchall_sql = '''SELECT * FROM student'''
    247     conn = get_conn(DB_FILE_PATH)
    248     fetchall(conn, fetchall_sql)
    249 
    250 def fetchone_test():
    251     '''查询一条数据...'''
    252     print('查询一条数据...')
    253     fetchone_sql = 'SELECT * FROM student WHERE ID = ? '
    254     data = 1
    255     conn = get_conn(DB_FILE_PATH)
    256     fetchone(conn, fetchone_sql, data)
    257 
    258 def update_test():
    259     '''更新数据...'''
    260     print('更新数据...')
    261     update_sql = 'UPDATE student SET name = ? WHERE ID = ? '
    262     data = [('HongtenAA', 1),
    263             ('HongtenBB', 2),
    264             ('HongtenCC', 3),
    265             ('HongtenDD', 4)]
    266     conn = get_conn(DB_FILE_PATH)
    267     update(conn, update_sql, data)
    268 
    269 def delete_test():
    270     '''删除数据...'''
    271     print('删除数据...')
    272     delete_sql = 'DELETE FROM student WHERE NAME = ? AND ID = ? '
    273     data = [('HongtenAA', 1),
    274             ('HongtenCC', 3)]
    275     conn = get_conn(DB_FILE_PATH)
    276     delete(conn, delete_sql, data)
    277 
    278 ###############################################################
    279 ####            测试操作     END
    280 ###############################################################
    281 
    282 def init():
    283     '''初始化方法'''
    284     #数据库文件绝句路径
    285     global DB_FILE_PATH
    286     DB_FILE_PATH = 'c:\test\hongten.db'
    287     #数据库表名称
    288     global TABLE_NAME
    289     TABLE_NAME = 'student'
    290     #是否打印sql
    291     global SHOW_SQL
    292     SHOW_SQL = True
    293     print('show_sql : {}'.format(SHOW_SQL))
    294     #如果存在数据库表,则删除表
    295     drop_table_test()
    296     #创建数据库表student
    297     create_table_test()
    298     #向数据库表中插入数据
    299     save_test()
    300     
    301 
    302 def main():
    303     init()
    304     fetchall_test()
    305     print('#' * 50)
    306     fetchone_test()
    307     print('#' * 50)
    308     update_test()
    309     fetchall_test()
    310     print('#' * 50)
    311     delete_test()
    312     fetchall_test()
    313 
    314 if __name__ == '__main__':
    315     main()


    原文:https://www.cnblogs.com/hongten/p/hongten_python_sqlite3.html
  • 相关阅读:
    项目完成 基于Django3.x版本 开发部署小结
    劳动节快乐!手写个核心价值观编码工具 Python实现
    基于.NetCore开发博客项目 StarBlog (4) markdown博客批量导入
    从概念、部署到优化,Kubernetes Ingress 网关的落地实践
    函数计算 HTTP 触发器支持异步,解放双手搭建 Web 服务
    Kruise Rollout: 让所有应用负载都能使用渐进式交付
    比心云平台基于阿里云容器服务 ACK 的弹性架构实践
    云原生×实战派:向业务聚焦,数字创新时代的最佳选择
    阿里云 Serverless 产品技术动态(2022 年 3 月)
    直播预告|企业云原生 IT 成本治理方案解析
  • 原文地址:https://www.cnblogs.com/z3286586/p/10668526.html
Copyright © 2020-2023  润新知