zoukankan      html  css  js  c++  java
  • SQLite

    SQLite3 可使用 sqlite3 模块与 Python 进行集成。

    sqlite3 模块是由 Gerhard Haring 编写的。它提供了一个与 PEP 249 描述的 DB-API 2.0 规范兼容的 SQL 接口。

    您不需要单独安装该模块,因为 Python 2.5.x 以上版本默认自带了该模块。

    为了使用 sqlite3 模块,您首先必须创建一个表示数据库的连接对象,然后您可以有选择地创建光标对象,这将帮助您执行所有的 SQL 语句。

    import sqlite3
    conn = sqlite3.connect('test.db')  #连接到SQlite数据库  #数据库文件是test.db,不存在,则自动创建
    cursor = conn.cursor()  #创建一个cursor
    

    优点

    轻量级:SQLite和C/S模式的数据库软件不同,它是进程内的数据库引擎,因此不存在数据库的客户端和服务器。使用SQLite一般只需要带上它的一个动态 库,就可以享受它的全部功能。而且那个动态库的尺寸也挺小,以版本3.6.11为例,Windows下487KB、Linux下347KB

    绿色软件:SQLite的另外一个特点是绿色:它的核心引擎本身不依赖第三方的软件,使用它也不需要“安装”。所以在部署的时候能够省去不少麻烦

    单一文件:所谓的“单一文件”,就是数据库中所有的信息(比如表、视图、触发器、等)都包含在一个文件内。这个文件可以copy到其它目录或其它机器上,也照用不误

    跨平台/可移植性
    如果光支持主流操作系统,那就没啥好吹嘘的了。除了主流操作系统,SQLite还支持了很多冷门的操作系统。我个人比较感兴趣的是它对很多嵌入式系统(比如Android、WindowsMobile、Symbin、Palm、VxWorks等)的支持

    内存数据库(in-memory database):
    这年头,内存越来越便宜,很多普通PC都开始以GB为单位来衡量内存(服务器就更甭提了)。这时候,SQLite的内存数据库特性就越发显得好用。
    SQLite的API不区分当前操作的数据库是在内存还是在文件(对于存储介质是透明的)。所以如果你觉得磁盘I/O有可能成为瓶颈的话,可以考虑切换 为内存方式。切换的时候,操作SQLite的代码基本不用大改,只要在开始时把文件Load到内存,结束时把内存的数据库Dump回文件就OK了。在这种情况下,前面提到的“onlinebackup API”就派上用场了,聪明的同学应该明白我为啥这么期待backup功能了吧

    缺点

    并发访问的锁机制
    SQLite在并发(包括多进程和多线程)读写方面的性能一直不太理想。数据库可能会被写操作独占,从而导致其它读写操作阻塞或出错

    SQL标准支持不全
    在它的官方网站上,具体列举了不支持哪些SQL92标准。我个人感觉比较不爽的是不支持外键约束。

    网络文件系统(以下简称NFS)
    有时候需要访问其它机器上的SQLite数据库文件,就会把数据库文件放置到网络共享目录上。这时候你就要小心了。当SQLite文件放置于NFS时,在并发读写的情况下可能会出问题(比如数据损坏)。原因据说是由于某些NFS的文件锁实现上有Bug


    数据库连接对象

    打开数据库时返回的对象 conn 就是一个数据库连接对象,它可以有以下操作:

    commit()--事务提交
    rollback()--事务回滚
    close()--关闭一个数据库连接
    cursor()--创建一个游标

    关于commit(),如果isolation_level隔离级别默认,那么每次对数据库的操作,都需要使用该命令,你也可以设置isolation_level=None,这样就变为自动提交模式。

    操作

    创建表

    import sqlite3
    
    conn = sqlite3.connect('test.db')
    # conn = sqlite3.connect('E:/test.db')
    # 也可以创建数据库在内存中。
    # conn = sqlite3.connect(":memory:")
    cursor = conn.cursor()
    cursor.execute(""" 
        create table company
        (id int primary key not null,
        name text not null,
        age int not null,
        address char(50));""")
    
    conn.commit()
    conn.close()
    

    插入 insert

    c.execute("INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS) VALUES (1, 'Paul', 32)")
    

    查询 select

    data = cursor.execute('select id, name, age, address from company')
    # data = cursor.execute(f'select * from company where id={1}')
    # data = cursor.execute('select * from company where id=?', ('1'))
    print(list(data)[0])
    # print(cursor.fetchall())  # 使用featchall获得结果集(list)
    

    更新 update

    result = '俊俊'
    cursor.execute(f"UPDATE COMPANY set name='{result}' where ID=1")
    # cursor.execute("UPDATE COMPANY set name='%s' where ID=1"%('俊俊'))
    # cursor.execute("UPDATE COMPANY set name='哈哈' where ID=1")
    conn.commit()
    conn.close()
    

    删除 delete

    result = '俊俊'
    cursor.execute(f"delete from company where name='{result}'")
    conn.commit()
    conn.close()
    
  • 相关阅读:
    USACO3.2.5Magic Squares
    USACO3.1.4Shaping Regions
    USACO3.2.3Spinning Wheels
    USACO3.1.3Humble Numbers
    USACO3.1.6Stamps
    USACO3.1.1AgriNet
    USACO3.3.5A Game
    USACO3.2.4Feed Ratios
    USACO3.2.2Stringsobits
    USACO3.2.6Sweet Butter
  • 原文地址:https://www.cnblogs.com/kai-/p/14425558.html
Copyright © 2011-2022 走看看