转:pysqlite笔记

这是一篇老笔记,原来是放在旧博客上 的,最近因为公司内部一个小东西,想使用简单点的数据库来存储数据,就想起用SQLite来做,上网搜索一些教程。竟然发现,原来一年多前,我也学过一阵 子,可惜因为不常用,现在已经基本忘记光光了,加上自己对数据库向来不是非常熟悉,就特地放到新博客上,顺便回顾一下。

这篇笔记的主要内容来源于python之sqlite3使用详解和PySqlite简明教程。

SQlite这个小型数据库,经常在Firefox或者其它软件中看到,它貌似没有独立的维护进程,而是把所有数据都存放在一个单独的文件中。上网搜了下资料,看了看Python上的pysqlite模块,它正是Python中对sqlite的封装实现。

数据库操作

Python的数据库模块都有统一的接口标准,所以数据库操作都基本上是统一的,基本上分成以下几步(假设数据库模块为db):

  1. 用db.connect()创建数据库连接,连接对象为conn。
  2. 如果不需要返回查询结果,就直接调用conn.execute()。
  3. 如果需要返回查询结果,则需要首先通过conn.cursor()创建游标对象cur,并使用cur.fetchone()等函数获取查询结果。
  4. 根据数据库隔离级别的不同,修改数据库后,可能需要使用conn.commit()手动提交事务。
  5. 调用相应的close()方法关闭cur及conn。

更加详细的数据库操作API可以参考Python的官方文档:点击这里。

PySqlite基本操作

1. 首先导入sqlite3模块

import sqlite3

2. 接着创建数据库链接

conn = sqlite3.connect('test.db')

其中"test.db"是数据库的名称,如果数据库文件不存在,就会自动创建;否则,就打开指定的数据库文件,同时创建一个数据库连接对象,该对象主要有以下操作:

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

其中,commit()方法用于提交事务,rollback()方法用于回滚至上次调用commit()方法的地方。可以通过Connection.isolation_level定义事务隔离级别,当该属性设置成None时,它会自动提交事务,不需要显式地调用commit()方法。

除了直接指定数据库文件之外,还有一种方法是在内存中创建数据库。方法是将":memory:"作为参数传递给sqlite.connect()函数:

conn = sqlite3.connect(":memory:")

3. 接下来就需要创建游标对象

cur = conn.cursor()

从网上找到一个关于游标的具体解释(来源):

游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每 次提取一条记录的机制。游标总是与一条SQL 选择语句相关联。因为游标由结果集(可以是零条、一条或由相关的选择语句检索出的多条记录)和结果集中指向特定记录的游标位置组成。当决定对结果集进行处 理时,必须声明一个指向该结果集的游标。

游标对象主要包含以下方法:

  • execute(): 执行sql语句
  • executemany(): 执行多条sql语句
  • close(): 关闭游标
  • fetchone(): 从结果中取一条记录
  • fetchmany(): 从结果中取多条记录
  • fetchall(): 从结果中取出所有记录

注:为了提高编程效率,PySqlite中的Connection对象同样包含execute()等函数,通过使用这些函数,可以避免创建游标对象,具体可以参考PySqlite的文档说明:点击这里,下面的例子来自前面的文档,介绍如何使用这些方法:

import sqlite3persons = [ ("Hugo", "Boss"), ("Calvin", "Klein") ] con = sqlite3.connect(":memory:") # Create the table con.execute("create table person(firstname, lastname)") # Fill the table (这里使用PySqlite提供的占用符格式,提高安全性) con.executemany("insert into person(firstname, lastname) values (?, ?)", persons) # Print the table contents (使用迭代的方法获取查询结果) # con.execute(..)方法返回游标对象,避免手动创建游标对象。 for row in con.execute("select firstname, lastname from person"): print row print "I just deleted", con.execute("delete from person").rowcount, "rows"

4. 通过execute()方法执行一条sql语句

SQLite中sql语句在语法格式,参考这里。

例如使用create table创建数据库表格:

cur.execute('''create table stocks ( date text, trans text, symbol text, qty real, price real)''')

表格创建之后,可以使用insert语句插入数据:

cur.execute("""insert into stocks values ('2006-01-05','BUY','RHAT',100,35.14)""")

5. 提交事务

conn.commit()

6. 关闭游标及数据库链接,释放资源

cur.close() conn.close()

PySqlite其它操作

在执行插入语句的时候,经常需要使用脚本中定义的变量,PySqlite中提供了多种形式的占位符,可以方便进行变量替换,提高安全性。

例如,回到之前插入的步骤:

cur.execute("""insert into stocks values ('2006-01-05','BUY','RHAT',100,35.14)""")

在这里,使用的是字符串sql语句的形式,如果我们需要更改一些数据,就不得不重新写一次,这样一来可重用性就大大降低了。因此,Python提供 了一种机制,可以使用Python中的变量来代替sql字符串语句中的特定占位符。而对具体的语法,可以通过查询DB模块的paramstyle参数来访 问,以下是几种类型的语法说明:

'qmark': Question mark style, e.g. '...WHERE name=?'
'numeric': Numeric, positional style, e.g. '...WHERE name=:1'
'named': Named style, e.g. '...WHERE name=:name'
'format': ANSI C printf format codes, e.g. '...WHERE name=%s'
'pyformat': Python extended format codes, e.g. '...WHERE name=%(name)s'

关于如何使用,可以参考这篇博客python 数据库查询参数风格。当然Python自带的文档中也有讲如何使用,也可以参考它。

目前PySqlite支持qmark和named两种形式。例如使用qmark形式,并且以元组(tuple)的形式作为第二个参数传递给execute函数:

t = ('2006-01-05','BUY','RHAT',100,35.14) cur.execute("insert into stocks values(?,?,?,?,?)", t)

当需要更多的数据的时候,这种方法就方便多了:

for t in [('2006-03-28', 'BUY', 'IBM', 1000, 45.00), ('2006-04-05', 'BUY', 'MSOFT', 1000, 72.00), ('2006-04-06', 'SELL', 'IBM', 500, 53.00)]: cur.execute('insert into stocks values (?,?,?,?,?)', t)

或者也可以使用executemany()方法来实现,该方法的第二个参数是一个序列或者迭代器,然后根据第一个参数指定的sql语句依次替换执行。上面的插入例子可以写成:

param_seq = [ ('2006-03-28', 'BUY', 'IBM', 1000, 45.00), ('2006-04-05', 'BUY', 'MSOFT', 1000, 72.00), ('2006-04-06', 'SELL', 'IBM', 500, 53.00) ] cur.executemany('insert into stocks values (?,?,?,?,?)', param_seq)

那么还有一种需求是,一次性执行多条sql语句,就好比在mysql的一些图形化界面中输入多条sql语句,然后点击执行,在PySqlite中可以通过executescript()方法来完成这个任务,例如(例子来源于官方文档):

cur.executescript(""" create table person( firstname, lastname, age ); create table book( title, author, published ); insert into book(title, author, published) values ( 'Dirk Gently''s Holistic Detective Agency', 'Douglas Adams', 1987 ); """)

SQLite笔记

1. 如何确定数据库中是否存在某个表
在SQLite中存在一张特殊的表SQLITE_MASTER,它是只读的,该表的定义语句如下所示:

CREATE TABLE sqlite_master (type TEXT, name TEXT, tbl_name TEXT, rootpage INTEGER, sql TEXT );

其中,对于Table来说,type值为"table",而name为数据库的表名称。那么查询数据库中所有的表,可以使用下面的方法:

SELECT name FROM sqlite_master
WHERE type='table'
ORDER BY name;

相应的如果,要查找是否存在表stocks可以这样做:

SELECT count(*) FROM sqlite_master where name='stocks' and type='table';

返回1则代表存在,0则表示不存在。

参考:http://sqlite.org/faq.html#q7

转载于:https://www.cnblogs.com/alecyrus/p/4809773.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/419566.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android页面布局更改,使用setContentView的方式更换布局文件从而更换界面

使用转换Activity的布局文件的方式,从而达到转换android页面的目的(这里没有使用Intent):程序很简单,摆一个大概出来:package com.seed.lee.setContentView;import android.app.Activity;import android.os.Bundle;import android…

oracle之单行函数之子查询

--睡得工资比abel高 select last_name,salary from employees where salary>(select salary from employees where last_nameAbel)运行结果 --返回job_id 与141号员工相同 salary比143号多 select last_name,job_id,salary from employees where job_id(select job_id from…

android模拟gps定位软件,gps定位模拟器下载最新版

卫星地图导航,从此出门想去哪里去哪里,再也不用因为不知道路线而烦忧!它还能实时定位,快速找人、找车!推荐!使用前提:1、定位模拟器是基于Xposed安卓框架下的插件,因此安装定位模拟器…

Java的堆与栈,科普给大家

1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。 2. 栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与…

android edittext禁止输入特殊字符,Android EditText禁止输入空格和特殊字符

/*** 禁止EditText输入特殊字符* param editText*/public static void setEditTextInhibitInputSpeChat(EditText editText){InputFilter filternew InputFilter() {Overridepublic CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, i…

oracle之单行函数之子查询之课后练习

/*************************************************************************************************/ 40. 谁的工资比 Abel 高?1). 写两条 SQL 语句.SELECT salaryFROM employeesWHERE last_name Abel--返回值为 11000SELECT last_name, salaryFROM employeesWHERE sal…

移动端开发的知识系统介绍

移动端开发1. 移动端适配&#xff1a;http://suqing.iteye.com/blog/1982733http://www.douban.com/note/261319445/ http://www.woshipm.com/ucd/150207.html<meta name"screen-orientation" content"portrait"><!-- 强制竖屏 --><meta na…

delphi android动态权限,DELPHI安卓动态权限申请

DELPHI安卓动态权限申请安卓8.0以前的版本&#xff0c;只需要给静态权限就可以了&#xff0c;但安卓8.0及以后的版本&#xff0c;还需要运行期用代码动态申请权限。下面以《蓝牙权限》为例&#xff0c;其他权限类似。Delphi 10.3 社区版&#xff0c;提供的 Sample 里面有一个例…

oracle之创建和管理表

create table emp2 AS Select employee_id,last_name name,hire_date,salary from employees select * from emp2 --创建表 --白手起家 /* create table emp1(id number(10),name varchar(20),salary number(10,2),hire_date date ) */

LocalBroadcastManager 的使用

一、使用本地广播发送一条广播&#xff08;本例为自己发送自己接收&#xff0c;本地广播也可以是其他应用接收&#xff09;然后接收到广播时回调Receiver类中的回调方法onReceive&#xff08;&#xff09;在此方法中自定义发出通知 代码 1 package com.qf.broadcastreceiver06;…

android xml正方形,使用Android Constraintlayout创建一排均匀分布的正方形

我正在努力创建一个由均匀分布的正方形链组成的布局&#xff0c;这些正方形可以填充可用空间。使用Android Constraintlayout创建一排均匀分布的正方形我到底想要的布局&#xff0c;看起来像这样&#xff1a;的想法是&#xff0c;与不同的宽高比手机这个正方形成长一点点地使用…

oracle之单行函数之子查询课后练习2

1. 查询和Zlotkey相同部门的员工姓名和雇用日期 a) select last_name,hire_date b) from employees c) where department_id ( d) select department_id e) from employees f) where last_name Zlotkey g…

JavaWeb 如何防止表单重复提交 - 使用Token,令牌

JavaWeb 如何防止表单重复提交 - 使用Token&#xff0c;令牌 说到重复提交 &#xff0c;应该想到两种场景&#xff1a;1. 在下单&#xff0c;或者支付 这种情况 那么不允许 刷新&#xff0c;不允许后退再点击提交&#xff08;后退之后提交会失败&#xff0c;修改了也不行&…

oracle之创建和管理表之练习题

51. 利用子查询创建表 myemp, 该表中包含 employees 表的 employee_id(id), last_name(name), salary(sal), email 字段1). 创建表的同时复制 employees 对应的记录create table myemp asselect employee_id id, last_name name, salary sal, email from employees 2). 创建表…

android icu4c 7.1编译报错,android4.0编译系统时候遇到的错误集

1、Android library XXX.so not in prelink map 错误解决在编译自己的Android library时可能会出现library XXX.so not in prelink map 错误&#xff0c;这是由于Android的预编译设置引起的&#xff0c;/build/core/prelink-linux-arm.map文件描述了预编译的模块需要修改所在文…

oracle之数据处理

--创建表 create table emp3 as select employee_id,last_name,hire_date,salary from employees--查询表 select * from emp3--插入表 insert into emp3 values(1001,AA,sysdate,10000) 运行结果 插入对应三项 --空值用null代替 --复制表 insert into emp3(last_name,employe…

HDU 4635(强连通分量分解

题目:给出一个有向图,要求添加最多的边数,使得图仍然不强连通. 思路:首先这个图在添加边之后肯定变成了两个强连通分量,现在就看怎么分.然后我们可以注意到,原图进行强连通分量分解之后必然存在一些分量的出度或入度为0,最小的分量肯定在这些分量之中.那么找出这个分量就可以得…

Android方法的概括,android中的Filter接口简介

一、结构public abstract class Filter extends Objectjava.lang.Objectandroid.widget.Filter二、概述过滤器通过过滤模式来约束数据&#xff0c;通常由实现了Filterable接口的子类来生成。 过滤操作是通过调用filter(CharSequence)或者filter(CharSequence, android.widget.F…

oracle之数据处理之课后练习

55. 更改 108 员工的信息: 使其工资变为所在部门中的最高工资, job 变为公司中平均工资最低的 job1). 搭建骨架update employees set salary (), job_id () where employee_id 108;2). 所在部门中的最高工资 select max(salary)from employeeswhere department_id (select …