python操作sqlite

版权声明:cao-denghua-非商业性使用-相同方式共享 3.0 中国大陆 (CC BY-NC-SA 3.0 CN) https://blog.csdn.net/caodenghua/article/details/80256333

python操作sqlite

在介绍之前先了解下sqlite以及基本操作。

第一部分 了解sqlite数据库

SQLite是一个开源的、内嵌式的关系型数据库。它最初发布于2000年,一个单纯的数据处理的工具,一个很好的学习程序设计的工具,一个学习各种关系相关概念的方便的学习工具

在sqlite的源程序里头部都有这样一段话,与大家共勉。

The author disclaims copyright to this source code. 
In place of a legal notice, here is a blessing:
May you do good and not evil.
May you find forgiveness for yourself and forgive others.
May you share freely, never taking more than you give.
# 作者放弃对本源码的版权。
# 代替法律通知,这里有一个祝福:
# 愿你做好事而不做坏事。
# 愿你宽恕自己,宽恕他人。
# 愿你自由分享,永不索取。

第二部分 使用sqlite数据库

1、创建数据库文件:

SQLite3 test.db

就生成了一个test.db在当前路径下。这样同时也SQLite3 挂上了这个test.db,如果存在test.db,就会直接连接。

尽管我们提供了数据库名,但如果这个数据库并不存在,SQLite并不会真正地创建它。SQLite会等到你真正地向其中增加了数据库对象之后才创建它,比如在其中创建了表或视图。这样做的原因是给你机会在将数据库写到外部文件之前对数据库做一些永久性的设置,如页的大小等。有些设置,如页大小、字符集(UTF-8或UTF-16)等,一旦数据库创建之后就不能再修改了。这个中间期是你能改它们的唯一机会。我们采用默认设置,因此,要将数据库写到磁盘,我们仅需要在其中创建一个表。输入如下语句:

create table test (id integer primary key, value text);
# 向表中插入几行数据:
insert into test (value) values('eenie');
insert into test (value) values('meenie');
insert into test (value) values('miny');
insert into test (value) values('mo');
# 将插入的数据取回:
# .mode col
# .headers on
SELECT * FROM test;
select last_insert_rowid();

让我们来为数据库创建一个索引和一个视图,后面的内容中将会用到它们。

create index test_idx on test (value);
create view schema as select * from sqlite_master;
# 使用.exit命令退出CLP。

2、 获得数据库的Schema信息

> .tables
schema test
#可以看到我们创建的表test和视图schema。同样的,要显示一个表的索引,可以键入命令.indices [table name]:
> .indices test
test_idx

使用.schema [table name]可以得到一个表或视图的定义(DDL)语句。如果没提供表名,则返回所有数据库对象(包括table、indexe、view和index)的定义语句:

> .schema test
CREATE TABLE test (id integer primary key, value text);
CREATE INDEX test_idx on test (value);

> .schema
CREATE TABLE test (id integer primary key, value text);
CREATE VIEW schema as select * from sqlite_master;
CREATE INDEX test_idx on test (value);

更详细的schema信息可以通过SQLite唯一的一个系统视图sqlite_master得到。这个视图是一个系统目录,它的结构如表2-1所示。

表2-1 sqlite_master表结构

编号 字段 说明
1 type 值为”table”、 “index”、 “trigger”或”view”之一。
2 name 对象名称,值为字符串。
3 tbl_name 如果是表或视图对象,此字段值与字段2相同。如果是索引或触发器对象,此字段值为与其相关的表名。
4 rootpage 对触发器或视图对象,此字段值为0。对表或索引对象,此字段值为其根页的编号。
5 SQL 字符串,创建此对象时所使用的SQL语句。

查询当前数据库的sqlite_master表,返回:

> .mode col
> .headers on
> select type, name, tbl_name, sql from sqlite_master order by type;
type        name        tbl_name    sql
----------  ----------  ----------  -------------------------------------
index       test_idx    test        CREATE INDEX test_idx on test (value)
table       test        test        CREATE TABLE test (id integer primary
view        schema      schema      CREATE VIEW schema as select * from s

3、 数据导出

可以使用.dump命令将数据库导出为SQL格式的文件。不使用任何参数,.dump将导出整个数据库。如果提供参数,CLP把参数理解为表名或视图名。

> .output file.sql
> .dump  #查询语句 .dump 表名;
> .output stdout  #把查询结果用屏幕输出

2、用.help可以看看有什么命令

>.help
>.tables           #创建了多少表
>.schema 表名      #看表结构
>.database
>.exit或者.quit    #退出

4、 数据导入

有两种方法可以导入数据,用哪种方法决定于要导入的文件的格式。如果文件由SQL语句构成,可以使用.read命令导入(执行)文件。如果文件是由逗号或其它定界符分隔的值(comma-separated values, CSV)组成,可使用.import [file][table]命令。此命令将解析指定的文件并尝试将数据插入到指定的表中。

> .show #查看当前的环境变量

导入数据

> drop table test;
> drop view schema;
> .read file.sql

5、 格式化

CLP提供了几个格式化选项命令。最简单的是.echo, 如果设置.echo on,则新输入的命令在执行前都会回显,默认值是off。.headers设置为on时,查询结果显示时带有字段名。当遇到NULL值时,如果需要以一个字符串来显示,使用.nullvalue命令设置,如:

sqlite> .nullvalue NULL

默认情况下使用空串。如果要改变CLP的shell提示符,使用.prompt [value],如:

sqlite> .prompt 'sqlite3> '
sqlite3>

.mode命令可以设置结果数据的几种输出格式。可选的格式为csv、column、html、insert、line、list、tabs和tcl。默认值是list,在此模式下显示结果时列间以默认的分隔符分隔。如果你想以CSV格式输出一个表的数据,可如下操作:

> .output file.csv
> .separator ,
> select * from test;
> .output stdout

文件file.csv的内容为:

1,eenie
2,meenie
3,miny
4,mo

因为有一个CSV模式,所以下面的命令会得到相似的结果:

> .output file.csv
> .mode csv
> select * from test;
> .output stdout

6、创建、备份和删除数据库

数据库的备份有两种方法。第1种是使用.dump,可得到SQL格式的文件。在命令行方式下可如下做:

sqlite3 test.db .dump > test.sql

在CLP中可如下做:

sqlite> .output file.sql
sqlite> .dump
sqlite> .exit

相应地,导入一个SQL格式备份的数据库可如下做:

sqlite3 test.db < test.sql

此处假设test.db不存在。如果它存在,则或许会因为数据库中有同名的对象而出错。

可以用复制的方法得到一个二进制的数据库文件拷贝。但也许在复制之前你想先抽空(vacuum)它,也就是释放数据库文件中未使用的空间,以得到一个更小的数据库文件。可操作如下:

sqlite3 test.db VACUUM
cp test.db test.backup

一般情况下,二进制的备份如不SQL备份兼容性好。尽管SQLite有很好的向上兼容性和各操作系统间文件格式的一致性,但如果想要将备份文件保留很长时间,还是SQL格式保险一些。

当一个数据库你不想再用时,简单地从操作系统中将其文件删除就行了。

7、获得关于物理的数据库结构信息,可以使用一个称为SQLite Analyzer的工具。

优秀图形化界面且跨平台的有:

SQLite Database Browser (http://sqlitebrowser.sourceforge.net)

SQLite Control Center (http://bobmanc.home.comcast.net/sqlitecc.html)

SQLiteManager (www.sqlabs.net/sqlitemanager.php)

第三部分 使用python建库

Sqlite 使用文件作为数据库,你可以指定数据库文件的位置。

import sqlite
cx = sqlite.connect("d:/test.db", encoding='cp936')

使用 sqlite 的 connect 可以创建一个数据库文件,上面我指明了路径。当数据库文件不存在的时候,它会自动创建。如果已经存在这个文件,则打开这个文件。encoding 指明保存数据所使用的编码,这里 cp936 是 Python 中自带的编码,其实就是 GBK 编码。cx 为数据库连接对象。

第四部分 python操作数据库的基本对象

1、数据库连接对象

象前面的 cx 就是一个数据库的连接对象,它可以有以下操作:
- commit()–事务提交
- rollback()–事务回滚
- close()–关闭一个数据库连接
- cursor()–创建一个游标

2、游标对象

所有 sql 语句的执行都要在游标对象下进行。

cu = cx.cursor()

这样定义了一个游标。游标对象有以下的操作:
- execute()–执行 sql 语句
- executemany–执行多条 sql 语句
- close()–关闭游标
- fetchone()–从结果中取一条记录
- fetchmany()–从结果中取多条记录
- fetchall()–从结果中取出多条记录
- scroll()–游标滚动

3、建表

cu=cx.cursor()
cu.execute("""create table catalog (
                    id integer primary key,
                    pid integer,
                    name varchar(10) UNIQUE
            )""")

上面语句创建了一个叫 catalog 的表,它有一个主键 id,一个 pid,和一个 name,name 是不可以重复的。

4、insert(插入)

cu.execute("insert into catalog values(0, 0, 'name1')")
cu.execute("insert into catalog values(1, 0, 'hello')")
cx.commit()

如果你愿意,你可以一直使用 cu 游标对象。
注意,对数据的修改必须要使用事务语句:commit()或 rollback(),且对象是数据库连接对象,这里为 cx。如果只是查询select,就不需要使用事务语句。

5、select(选择)

cu.execute("select * from catalog")
cu.fetchall()
[(0, 0, 'name2'), (1, 0, 'hello')]

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

cu.execute("select * from catalog where id = 1")
cu.fetchone()
(1, 0, 'hello')

对数据库没有修改的语句,执行后不需要再执行事务语句。

6、update(修改)

cu.execute("update catalog set name='name2' where id = 0")
cx.commit()
cu.execute("select * from catalog")
cu.fetchone()
(0, 0, 'name2')

7、delete(删除)

cu.execute("delete from catalog where id = 1")
cx.commit()
cu.execute("select * from catalog")
cu.fetchall()
[(0, 0, 'name2')]

以上是关于如何使用 PySqlite 来操作 Sqlite 的简单示例。

猜你喜欢

转载自blog.csdn.net/caodenghua/article/details/80256333