Python操作SQLite简明教程

发布时间:2018-12-20  栏目:sqlite  评论:0 Comments

SQLite是千篇一律逐步悠悠轻型的本土文件数据库,是听从ACID的关联式数据库管理网。它的计划性目的是嵌入式的,而且近来早已于许多嵌入式产品面临选拔了其,它的力量强、速度快,它占用资源非凡之低,在嵌入式设备中,可能单待几百K的内存就够了。它会援助Windows/Linux/Unix等主流的操作系统,同时会及森程序语言相结合。

一、SQLite简介

无异于、SQLite的数据类型

SQLite是一个分包在C库中之轻量级数据库。它并不需要独立的护卫过程,并且同意行使不标准变体(nonstandard
variant)的SQL查询语句来访问数据库。一些使可以SQLite保存内部数据。它呢可以构建以原型的时刻用,以便让下转移至重大型的数据库,比如PostgreSQL或者Oracle。

当展开数据库操作前,有只问题亟需声明,就是SQLite的数据类型,和其他的数据库不同,Sqlite补助的数据类型有他自己的特色:Typelessness(无类型)。
SQLite是无类型的,这代表你可以保存任何项目标数码及你所思要封存之任何表的旁列着,
无论这排声明的数据类型是呀。

sqlite3模块由Gerhard
Häring编写,提供了一个SQL接口,那多少个接口的计划本了由PEP 249叙的DB-API
2.0表达。

设多数的数据库在数据类型上都有严苛的限量,在起表的当儿,每一样列都必须制定一个数据类型,只有切合该数据类型的数额足以被保存在立时无异列当中。而在SQLite
2.X蒙,数据类型那多少个特性只属数据本生,而休跟数量给在哪一样排有关,也就是说数据的品类并无深受数码列限制(有一个异:INTEGER
PRIMARY KEY,该列只可以存整型数据)。

次、成立并开拓数据库

可是当SQLite进入及3.0版的时,这多少个题材似乎以生出矣初的答案,SQLite的开发者先导限制这种无类型的用,在3.0版中,每一样排列始发备好的类,并且以数据存入该列的时节,数据库会试图把数量的型为该类型转换,然后坐变后的类别存储。当然,如若换给认为是不可行的,SQLite依然会储存这些数,就如他的先驱者版本一样。

为了用是模块,必须先创设一个一连(Connection)对象来代表数据库。在偏下的例证中,数据以会让封存于
example.db 文件中:

举个例证,假如你图为一个INTEGER类型的列中插入一个字符串,SQLite会检查是字符串是否有整型数据的风味,
假使有以可于数据库所识别,那么该字符串会吃移成为整型再保存,假如那一个,则要当字符串存储。
诚然SQLite允许忽略数据类型, 然而仍旧提议以公的Create
Table语句被指定数据类型. 因为数量列对你跟其余的程序员交换,
或者你准备更换掉你的数据库引擎时亦可起至一个唤起或帮助的来意.
SQLite帮助大的数据类型, 如:

复制代码 代码如下:

1.NULL,值是NULL
2.INTEGER,值是起标志整形,按照值的轻重缓急为1,2,3,4,6要么8字节存放在
3.REAL,值是浮点型值,以8配节IEEE浮点数存放
4.TEXT,值是文本字符串,使用数据库编码(UTF-8,UTF-16BE或者UTF-16LE)
5.BLOB,只是一个数据块,完全依据输入存放(即无准换)

import sqlite3
conn = sqlite3.connect(‘example.db’)

SQLite的操作接口

假设指定的数据库有,就会从来打开这数据库,否则用新建一再打开。
为足以提供专用名 :memory: 来在内存中起数据库。

SQLite的2单重要结构体:

其三、数据库连接对象

sqlite3 *pdb,数据库句柄,跟文件句柄FILE很类似
sqlite3_stmt
*stmt,那个一定给ODBC的Command对象,用于保存编译好之SQL语句

一经拥有了连(Connection)对象,就可以创建游标(Cursor)对象并调用他的execute()方法来执行SQL语句:

SQLite的5独重点的函数:

复制代码 代码如下:

sqlite3_open(), 打开数据库
sqlite3_exec(),执行非查询的sql语句
sqlite3_prepare(),准备sql语句,执行select语句或者一旦采取parameter
bind时,用是函数(封装了sqlite3_exec).
sqlite3_step(),在调用sqlite3_prepare后,使用这函数在笔录集中活动。
sqlite3_close(),关闭数据库文件

c = conn.cursor()
 
 # Create table
 c.execute(”’CREATE TABLE stocks             
     (date text, trans text, symbol text, qty real, price real)”’)
 
 # Insert a row of data
 c.execute(“INSERT INTO stocks VALUES
(‘2006-01-05′,’BUY’,’RHAT’,100,35.14)”)
 
 # Save (commit) the changes
 conn.commit()
 
 # We can also close the connection if we are done with it.
 # Just be sure any changes have been committed or they will be lost.
 conn.close()
 

还有雷同多元之函数,用于从记录集字段中获取数据,如:

保存后的数量是恒久的,并且可于今后的拜访被可用。

sqlite3_column_text(),取text类型的数码
sqlite3_column_blob(),取blob类型的多少
sqlite3_column_int(),取int类型的数据

季、增删改查

C++往日准备

1.建(create)表

下载SQLite,分别从http://www.sqlite.org/2013/sqlite-amalgamation-3071700.zip、
http://www.sqlite.org/2013/sqlite-dll-win32-x86-3071700.zip下载SQLite的源文件和库文件。

复制代码 代码如下:

不过sqlite-dll-win32-x86-3071700.zip中并从未供SQLite的lib文件,需要团结编译生成。解压sqlite-dll-win32-x86-3071700.zip到sqlite-dll-win32-x86-3071700目,再将VS安装目录下VC中之LIB.EXE、LINK.EXE、mspdb80.dll(这里用之凡VS2008)拷贝到sqlite-dll-win32-x86-3071700,执行LIB.EXE
/DEF:SQLITE3.DEF /MACHINE:IX86 就可以拿走SQLITE3.LIB文件。

c.execute(“create table catalog (id integer primary key,pid integer,name
varchar(10) UNIQUE,nickname text NULL)”)

C++访问SQLite

点语句创立了一个叫catalog的注解,它有一个主键id,一个pid,和一个name,name是免可以更的,以及一个nickname默认为NULL。

C++对SQLite进行操作的代码如下:

2.删除表(DROP),清空表(TRUNCATE)

复制代码 代码如下:

复制代码 代码如下:

#include “stdafx.h”
#include <string.h>
using namespace std;

c.execute(“drop table catalog”)

#include “sqlite3.h”
#pragma comment(lib, “SQLITE3.LIB”)

面语句以catalog表删除。

static int SelectCallback(void *notUsed, int argc, char **argv, char
**azColName)
{
 for (int i = 0 ; i < argc ; i++)
 {
 printf(“%s = %s”, azColName[i], (argv[i] ? argv[i] : “NULL”));
 if (i != argc -1)
 {
 printf(“, “);
 }
 }
 printf(“\n”);
 return 0;
}

除此以外SQLite中没有清空表的操作,使用如下情势取代:

int _tmain(int argc, _TCHAR* argv[])
{
 sqlite3 * pDB;
 char* errMsg;

复制代码 代码如下:

// 打开SQLite数据库
 int res = sqlite3_open(“sql.db”, &pDB);
 if ( res != SQLITE_OK ){
 printf(“Can’t open database: %s\n”, sqlite3_errmsg(pDB));
 sqlite3_close(pDB);
 return -1;
 }

c.execute(“delete from catalog”)

// 创建表
 string strSQL= “create table test (id int, name text);”;
 res = sqlite3_exec(pDB , strSQL.c_str() ,0 ,0, &errMsg);
 if (res != SQLITE_OK)
 {
 printf(“Create table error: %s\n”, errMsg);
 //return -1;
 }

3.插入(insert)数据,更改(uptate)数据

// 插入数据
 res = sqlite3_exec(pDB,”begin transaction;”,0,0, &errMsg);
 for (int i= 1; i < 10; ++i)
 {
 char sql[512];
 sprintf_s(sql, “insert into test values(%d, %s);”, (i+10), “\”Test
Name\””);

平时SQL语句被会用到python变量作为价值(value)。不提议直接接纳python的字符串运算来布局查询语句,因为这样是未安全之,会要您的先后容易碰到SQL注入攻击。

res = sqlite3_exec(pDB, sql,0,0, &errMsg);
 if (res != SQLITE_OK)
 {
 printf(“Insert error: %s\n”, errMsg);
 return -1;
 }
 }
 res = sqlite3_exec(pDB,”commit transaction;”,0,0, &errMsg);

得动用DB-API提供的参数代换。在缅怀使用值(value)的地点停放一个’?’作为占位符,然后提供一个由值(value)组成的元组作为游标(cursor)中execute()方法的亚独参数。(其他的数据库模块可能用其它占位符,比如
‘%s’ 或者 ‘:1’)

// 查询数据
 strSQL= “select * from test;”;
 res = sqlite3_exec(pDB, strSQL.c_str(), SelectCallback, 0 ,
&errMsg);
 if (res != SQLITE_OK)
 {
 printf(“Select error: %s\n”, errMsg);
 return -1;
 }

复制代码 代码如下:

 // 关闭数据库
 sqlite3_close(pDB);

# Larger example that inserts many records at a time
purchases = [(‘2006-03-28’, ‘BUY’, ‘IBM’, 1000, 45.00),
(‘2006-04-05’, ‘BUY’, ‘MSFT’, 1000, 72.00),
(‘2006-04-06’, ‘SELL’, ‘IBM’, 500, 53.00),
]
c.executemany(‘INSERT INTO stocks VALUES (?,?,?,?,?)’, purchases)

return 0;
}

c.execute(“UPDATE catalog SET trans=’SELL’ WHERE symbol = ‘IBM'”)

而可能感兴趣的篇章:

4.查询(select)数据

恰恰使前方所说,提倡使用元组举办操作。

复制代码 代码如下:

# Never do this — insecure!
symbol = ‘RHAT’
c.execute(“SELECT * FROM stocks WHERE symbol = ‘%s'” % symbol)

# Do this instead
t = (‘RHAT’,)
c.execute(‘SELECT * FROM stocks WHERE symbol=?’, t)
print c.fetchone()

5.删除(delete)数据

复制代码 代码如下:

t=(‘RHAT’)
c.execute(“DELETE * FROM stocks WHERE symbol=?”, t)

乃或许感兴趣的篇章:

留下评论

网站地图xml地图