Python教程:SQLite操作

Python教程:SQLite操作


发布日期: 1970-01-01 更新日期: 2015-01-29 编辑:bukun 浏览次数: 4973

标签:

摘要: Python编程语言从出现至今已经经过了将近二十年的时间,它依据其强大的功能以及易于操作的方法在开发领域中依据占据着重要的地位。 Python SQLITE 数据库是一款非常小巧的嵌入式开源数据库软件,也就是说没有独立的维护进程,所有的维护都来自于程序本身。它...

Python编程语言从出现至今已经经过了将近二十年的时间,它依据其强大的功能以及易于操作的方法在开发领域中依据占据着重要的地位。 Python SQLITE 数据库是一款非常小巧的嵌入式开源数据库软件,也就是说没有独立的维护进程,所有的维护都来自于程序本身。它使用一个文件存储整个数据库,操作十分方便。它的最大优点 是使用方便,功能相比于其它大型数据库来说,确实有些差距。但是性能表现上,SQLITE并不逊色。麻雀虽小,五脏俱全, sqlite 实现了多数 sql-92 的标准,比如说 transaction 、 trigger 和复杂的查询等。从Python2.5开始,SQLite3就成了Py的标准模块了,这也是Python中唯一一个数据库接口类模块,这大大方便了我们用Python SQLITE数据库开发小型数据库应用系统。本教程使用了一个文本文件的记录集,开始教程之前,请看一下它的格式。教程只涉及了数据库操作的一部分。实际上这一部分使用主要取决于对SQL的理解。

建立数据库与表

# -*- coding: utf-8 -*-
import sqlite3 as sqlite
# 建立与数据库的连接,如果不存在,则新建
cx = sqlite.connect("/v/test.db")
# 游标
cu = cx.cursor()
def add_table():
    '''
    在数据库中添加一个table
    '''
    cu.execute("""create table tab_day
     ( id integer primary key)""")
if __name__ == '__main__':
    add_table()

不需要显式的创建一个sqlite数据库,在调用connect函数的时候,指定库名称,如果指定的数据库存在就直接打开这个数据库,如果不存在就新创建一个再打开。

添加字段

# -*- coding: utf-8 -*-
import sqlite3 as sqlite
cx = sqlite.connect("db.db")
cu = cx.cursor()
def parse_file(infile):
    '''根据输入的文件进行解析,只解析其第一行,根据第一行,生成字段名。    '''
    # indes = '/home/bk/ws/qixiang/year_table/fields.csv'
    fields = (file(infile).readlines())[0].strip().strip(',')
    fields = fields.split(',')
    fields[0 ] = '"%s"' % (fields[0 ]) # 第一字段为字符串型 
    types = ['integer'] * len(fields)
    types[0] = '"%s"' % ('string')     # 第一字段为字符串型
    return((fields,types))
def add_field(fields, types):
    '''
    对数据库添加字段
    '''
    for field, type in zip(fields, types):
        sql_cmd = '''alter table tab_day add column %s %s not null 
            default 32766;''' % (field, type)
        cu.execute(sql_cmd)
if __name__ == '__main__':
    infile = '1951.txt'
    (fields, types) = parse_file(infile)
    add_field(fields, types)

添加记录

# -*- coding: utf-8 -*-
import sqlite3 as sqlite
cx = sqlite.connect("db.db")
cu = cx.cursor()
def test_exist(recs):
    '''
    测试是否存在相同的记录
    '''
    sql_cmd = '''select * from tab_day where v01000 = %s 
        and V04001 = %s and V04002 = %s and V04003=%s''' 
         % (recs[0], recs[1], recs[2], recs[3])
    cu.execute(sql_cmd)
    res = cu.fetchall()
    if len(res) > 0:
        return True
    else:
        return False
def add_recs(infile):
    '''
    根据输入文件,向数据库中添加记录
    '''
    cnts = file(infile).readlines()
    cnts = [cnt.strip() for cnt in cnts]
    cnts = [cnt.strip(',') for cnt in cnts]
    heads = cnts[0].split(',')
    head = ','.join(heads)
    cnts = cnts[1:]  # 第一行为字段
    for cnt in cnts:
        recs = cnt.split(',')
        recs = [x.strip() for x in recs]
        recs[0] = '"%s"' % (recs[0])
        record = ','.join(recs)
        if len(recs) == len(heads):
            test_recs = recs[:4]
            if test_exist(test_recs):
                print('Exist!')
                continue
            sql_cmd = 'insert into tab_day (%s) values (%s) ;' 
                % (head, record)
            cu.execute(sql_cmd)
        else:
            print('error')
    cx.commit() # 提交事务
if __name__ == '__main__':
    infile = '1951.txt'
    add_recs(infile)

在插入数据之前,先对数据库中是否已经有此记录进行判断。这里使用了前4个字段,其实际意义为站点、年、月、日。需要提醒的是,只有提交了之后,插入数据才能生效。我们使用数据库连接对象cx来进行提交commit和回滚rollback操作。

关注公众号
获取免费资源

随机推荐


Copyright © Since 2014. 开源地理空间基金会中文分会 吉ICP备05002032号

Powered by TorCMS

OSGeo 中国中心 邮件列表

问题讨论 : 要订阅或者退订列表,请点击 订阅

发言 : 请写信给: osgeo-china@lists.osgeo.org