zoukankan      html  css  js  c++  java
  • python学习笔记(数据库支持)

    数据库支持

    纯文本只能够实现一些简单有限的功能。如果想要实现自动序列化,也可以使用 shelve 模块和 pickle 模块来实现。但是,如果想要自动的实现数据并发访问,以及更标准,更通用的数据库(database)存储方式还是使用数据库。

    python数据库API

    很多支持SQL标准的数据库在Python中都有对应的客户端模块。为了在提供相同功能(基本相同)的不同模块之间进行切换(兼容),Python 规定了一个标准的 DB API。目前API最新版本时 2.0,具体可以参考这里:https://www.python.org/dev/peps/pep-0249/

    全局变量

    任何支持2.0版本的DB API的数据库模块都定义了3个描述模块特性的全局变量:

    apilevel            所使用的Python DB API版本
    threadsafety        模块的线程安全级别       
    paramstyle          在SQL查询中使用的参数风格

    apilevel是个字符串常量,提供正在使用API的版本号,对于DB API 2.0 版本来说

    • 值可能是 ‘1.0’,
    • 也可能是 ‘2.0’;

    threadsafety 这这只有在使用多线程时才有参考价值,取值范围为0~3的整数。

    • 0 表示完全不共享模块
    • 1 表示线程本身可以共享模块,但不对连接共享
    • 3 表示模块完全是线程安全的

    paramstyle 表示在执行多次类似查询的时候,参数是如何被拼接到SQL查询中的:

    • 'format'表示标准的字符串格式化
    • 'pyformat'表示扩展的格式代码,使用字典拼接
    • 'qmark'表示使用问号
    • 'numberic'表示使用 :1 或 :2 格式的字段
    • 'named’表示使用 :name 格式的字段

     异常

    API中定义了(层次结构)一些异常类,可以通过 except 块捕捉多种异常。如果想要知道更多DB API异常的想想可以参考这里:http://www.python.org/dev/peps/pep-0249/#exceptions,下面是DB API中使用的异常:

    ===============================================================================
    异常                       超类               描述                             
    ===============================================================================
    StandarError                                所有异常的泛型基类
    Waring                  StandarError        在非致命错误发生时引发
    Error                   StandarError        所有错误条件的泛型超类
    InterfaceError          Error               关于接口而非数据库的错误
    DatabaseError           Error               与数据库相关的错误的基类 
    DataError               DatabaseError       与数据库相关的问题,比如值超出范围
    OperationalError        DatabaseError       数据库内部操作错误
    IntegrityError          DatabaseError       关系完整性受到影响,比如键检查失败
    InternalError           DatabaseError       数据库内部错误,比如非法游标
    ProgramningError        DatabaseError       用户编程错误,比如未找到表
    NotSupportedError       DatabaseError       请求不支持的特性(比如回滚)

    连接和游标

    使用 connect 函数连接到数据库,该函数有多个参数,具体使用方法取决于对应的数据库。下面是具体的参数含义(使用时推荐使用关键字参数的方式,并按表中给定的顺序传递它们,参数类型都应为字符串):

    ==================================================
    参数名                  描述                                 
    ==================================================
    dsn                    数据库源名称,给出参数表示数据库依赖(必选)  
    user                   用户名(可选)                           
    passowrd               密码(可选)                                     
    host                   主机名(可选)                                      
    database               数据库名(可选)        

    connect函数返回连接对象,该对象表示目前和数据库的会话,对象支持的方法如下:

    =============================================================
    方法名                 描述                                 
    =============================================================
    close()               关闭连接之后,连接对象和它的游标均不可用
    commit()              如果支持的话就提交挂起事务,否则不可用
    rollback()            回滚挂起的事务
    cursor()              返回连接的游标对象

    close 可以在每次修改数据库后都进行提交,而不是仅仅在准备关闭才提交,准备关闭数据时,使用close 方法。

    commit 方法总是可用的,但如果数据库不支持事务,它就没有任何作用。如果关闭了连接但还有未提交的事务,它们会隐式地回滚---但是只有在数据库支持持回滚的时候才可以。完成插入并且做出某些更改后确保已经进行了提交,这样才可以将这些修改真正地保存到文件中。

    rollback 方法如果使用的数据库支持的话,就会撤销所有未提交的事务。 

    cursor 方法则返回一个游标对象,可以通过游标执行SQL查询并检查结果。游标比连接支持更多方法,也更加易用,下面是游标方法的概述:

    ====================================================================================
    名称                                     描述                                 
    ====================================================================================
    callproc(name[, params])            使用给定的名称和参数(可选)调用以命名的数据库程序
    close()                             关闭游标后,游标不可用
    execute(oper[, params])             执行SQL操作,可选的参数
    executemany(oper, pseq)             对序列中的每个参数执行SQL操作
    fetchone()                          把查询结果集中的下一行保存为序列或者None
    fetchmany([size])                   获取查询的结果集中的多行,默认尺寸为arraysize
    fetchall()                          将所有(剩余)的行作为序列的序列
    nextset()                           跳至下一个可用的结果集(可选)
    setinputsizes(sizes)                为参数预先定义的内存区域
    setoutputsize(size[, col])          为获取的大数据库值设定缓冲区尺寸

    fetchall()返回结果集中的全部数据,结果为一个tuple的列表。每个tuple元素是按建表的字段顺序排列。注意,游标是有状态的,它可以记录当前已经取到结果的第几个记录了,因此,一般你只可以遍历结果集一次。在上面的情况下,如果执行fetchone()会返回为空。这一点在测试时需要注意

    游标对象特性:

    ==================================================
    名称                       描述                                 
    ==================================================
    description            结果列描述的序列,只读                       
    rowcount               结果中的行数,只读
    arraysize              fetchmany中返回的行数,默认为1

    类型

    DB API 定义了Python中的类型和数据库类型的对应关系。通过特殊的类型和值的构造函数以及常量(单例模式),如下(一些模块可能并不是完全按照这些定义):

    ==================================================
    名称                                  描述                                 
    ==================================================
    Date(year, month, day)              创建保存日期值的对象
    Time(hour, minute, second)          创建保存时间值的对象
    Timestamp(y, mon, d, h, min, s)     创建保存时间戳的对象
    DateFromTicks(ticks)                创建保存自新纪元以来的秒数的对象
    TimeFromTicks(ticks)                创建保存来自秒数的时间值的对象
    TimestampFromTicks(ticks)           创建保存来自秒数的时间戳值的对象
    Binary(string)                      创建保存二进制字符串值的对象
    STRING                              描述二进制列(比如LONG或RAW)
    BINARY                              描述数字列
    NUMBER                              描述数字列
    DATETIME                            描述日期/时间列
    ROWID                               描述行ID列

    SQLite和PySQLite

    SQLite是一个小型的数据库引擎,它不基于集中式数据库存储机制,而是直接作用于本地文件。它的官方站点为http://www.sqlite.org。

    而pysqlite 则是一个 sqlite 为 python 提供的 api 接口,它让一切对于 sqlite 的操作都变得异常简单

    在Python 2.5 之后,SQLite 的包装(PySQLite)已经被包含在标准库中了(在最新的Python版本中已经包含了SQLite数据库了,并不需要单独安装)。

    入门

    将SQLite作为名为sqlite3的模块导入,即可创建一个数据库文件(不存在则创建,可指定路径),并连接到数据库,下面是一个简单的示例:

    >>> import sqlite3
    >>> conn=sqlite3.connect('testDB.db') #创建数据库
    >>> curs=conn.cursor() #获得连接的游标
    >>> conn.commit()      #提交更改
    >>> conn.close()       #关闭

    数据库应用程序示例

    创建和填充表

    import sqlite3
    
    #创建数据库
    conn=sqlite3.connect('myDatabase.db') 
    curs=conn.cursor()
    
    #创建数据库表
    curs.execute('''CREATE TABLE myDatabase
    
                  ( id       integer     primary key,
                    name     varchar(10) not null,
                    age      int         not null,
                    address  char(50)    
                  )
                   ''')
    
    
    #插入三条数据
    curs.execute("insert into myDatabase values(0,'lily',23,'California')")
    curs.execute("insert into myDatabase values(1,'paul',25,'texas')")
    curs.execute("insert into myDatabase values(2,'allen',26,'norway')")
    conn.commit()
    
    #查询
    >>> curs.execute('select * from myDatabase')
    >>> curs.fetchall()
    [(0, u'lily', 23, u'California'), (1, u'paul', 25, u'texas'), (2, u'allen', 26, u'norway')]
    >>> curs.execute('select * from myDatabase where id=1')
    >>> curs.fetchall()
    [(1, u'paul', 25, u'texas')]
    >>>
    #修改
    >>> curs.execute("update myDatabase set name='lucy' where id=0")
    >>> conn.commit()
    >>> curs.execute('select * from myDatabase')
    >>> curs.fetchall()
    [(0, u'lucy', 23, u'California'), (1, u'paul', 25, u'texas'), (2, u'allen', 26, u'norway')]
    
    #删除
    >>> curs.execute('delete from myDatabase where id =1')
    >>> conn.commit()
    >>> curs.execute('select * from myDatabase')
    >>> curs.fetchall()
    [(0, u'lucy', 23, u'California'), (2, u'allen', 26, u'norway')]
    >>> 

    查询

    >>> import sqlite3
    >>> conn=sqlite3.connect('testDB.db')>>> curso=conn.execute('select * from test')
    >>> for row in curso:
            print 'id= ', row[0]
            print 'name= ',row[1]
            print 'age= ',row[2]
            print 'address= ',row[3]
        conn.close()
        
    id=  0
    name=  lily
    age=  23
    address=  California
    id=  1
    name=  paul
    age=  25
    address=  texas
    id=  2
    name=  allen
    age=  26
    address=  norway
    >>> 

    参考资料:

    https://docs.python.org/2/library/sqlite3.html

  • 相关阅读:
    机器学习-数据与特征工程
    机器学习-聚类(clustering)算法:K-means算法
    机器学习-回归中的相关度和R平方值
    机器学习-非线性回归(Logistic Regression)及应用
    机器学习-多元线性回归(一)
    机器学习-简单线性回归(二)
    MVC,MVP,MVVM
    Git从入门到熟练
    NSNotificationCenter
    FMDB的线程安全
  • 原文地址:https://www.cnblogs.com/whats/p/4744466.html
Copyright © 2011-2022 走看看