SQLite3 可使用 sqlite3 模块与 Python 进行集成。 sqlite3 模块是由 Gerhard Haring 编写的。 它提供了一个与 PEP 249 描述的 DB-API 2.0 规范兼容的 SQL 接口。 不需要单独安装该模块,因为 Python 2.5.x 以上版本默认自带了该模块。 为了使用 sqlite3 模块,首先必须创建一个表示数据库的连接对象。
sqlite3 模块常用的方法:
sqlite3.connect(database [,timeout ,other optional arguments])
该 API 打开一个到 SQLite 数据库文件 database 的链接。 可以使用memory
来在 RAM 中打开一个到 database 的数据库连接, 而不是在磁盘上打开。如果数据库成功打开,则返回一个连接对象。cursor([cursorClass])
该例程创建一个 cursor,将在 Python 数据库编程中用到。 该方法接受一个单一的可选的参数cursorClass
。如果提供了该参数, 则它必须是一个扩展自 sqlite3.Cursor 的自定义的cursor
类。execute(sql [, optional parameters])
该例程执行一个 SQL 语句。 该 SQL 语句可以被参数化(即使用占位符代替 SQL 文本)。 sqlite3 模块支持两种类型的占位符:问号和命名占位符(命名样式)。commit()
该方法提交当前的事务。如果未调用该方法, 那么自上一次调用commit()
以来所做的任何动作对其他数据库连接来说是不可见的。rollback()
该方法回滚自上一次调用commit()
以来对数据库所做的更改。close()
该方法关闭数据库连接。请注意,这不会自动调用commit()
。 如果之前未调用commit()
方法,就直接关闭数据库连接, 所做的所有更改将全部丢失!fetchone()
该方法获取查询结果集中的下一行,返回一个单一的序列, 当没有更多可用的数据时,则返回None
。fetchall()
该例程获取查询结果集中所有(剩余)的行,返回一个列表。 当没有可用的行时,则返回一个空的列表。
import os
import sqlite3
from pathlib import Path
db_file = Path('xx_test.db')
if db_file.exists(): db_file.unlink()
conn = sqlite3.connect(db_file)
cursor = conn.cursor()
cursor.execute('DROP TABLE if EXISTS company')
cursor.execute('create table company (id int primary key not null ,'
'person varchar(100) ,'
'phone varchar(50) ,'
'email varchar(50));')
<sqlite3.Cursor at 0x7f3bc7374140>
cursor = conn.cursor()
cursor.execute(r"insert into company values (1,'tom','123456789','124567@outlook.com');")
conn.commit()
cursor.execute('select * from company;')
<sqlite3.Cursor at 0x7f3bc7374040>
cursor.fetchall()
[(1, 'tom', '123456789', '124567@outlook.com')]
cursor.execute("update company set phone = 2500000 where ID=1")
conn.commit()
再次查询修改后的值。
cursor.execute('select * from company;')
cursor.fetchall()
[(1, 'tom', '2500000', '124567@outlook.com')]
也可以使用遍历输出。
cursor.execute('select * from company;')
for row in cursor:
print( "id = ", row[0])
print( "name = ", row[1])
print( "phone = ", row[2])
print ("email = ", row[3])
id = 1 name = tom phone = 2500000 email = 124567@outlook.com
上面分布执行了增加、插入、修改操作,接下来执行基本的删除方法。
SQLite 的 DELETE
查询用于删除表中已有的记录。
可以使用带有 WHERE 子句的 DELETE 查询来删除选定行,
否则所有的记录都会被删除。
cursor.execute("DELETE from company where ID=1;")
conn.commit()
cursor.execute('select * from company;')
<sqlite3.Cursor at 0x7f3bc7374040>
cursor.fetchall()
[]
显然已经将表data内id为1的数据删除了。
视图(View)
视图(View)只不过是通过相关的名称存储在数据库中的一个 SQLite 语句。 视图(View)实际上是一个以预定义的 SQLite 查询形式存在的表的组合。 视图可以包含一个表的所有行或从一个或多个表选定行。 视图(View)可以从一个或多个表创建,这取决于要创建视图的 SQLite 查询。 视图是一种虚表,允许用户实现以下几点:
- 用户或用户组查找结构数据的方式更自然或直观。
- 限制数据访问,用户只能看到有限的数据,而不是完整的表。
- 汇总各种表中的数据,用于生成报告。
SQLite 视图是只读的,因此可能无法在视图上执行 DELETE、INSERT 或 UPDATE 语句。 但是可以在视图上创建一个触发器,当尝试 DELETE、INSERT 或 UPDATE 视图时触发, 需要做的动作在触发器内容中定义。
cursor.execute("INSERT INTO company (ID,PERSON,PHONE,EMAIL) \
VALUES (1, 'Paul', 2000000,'2000000@qq.com' )")
<sqlite3.Cursor at 0x7f3bc7374040>
cursor.execute("INSERT INTO company (ID,PERSON,PHONE,EMAIL) \
VALUES (2, 'Allen',1500000,'1500000@qq.com')")
<sqlite3.Cursor at 0x7f3bc7374040>
cursor.execute("INSERT INTO company (ID,PERSON,PHONE,EMAIL) \
VALUES (3, 'Teddy', 2500000,'2500000@qq.com' )")
<sqlite3.Cursor at 0x7f3bc7374040>
cursor.execute("INSERT INTO company (ID,PERSON,PHONE,EMAIL)\
VALUES (4, 'Mark', 6500000,'6500000@qq.com' )")
<sqlite3.Cursor at 0x7f3bc7374040>
cursor.execute("INSERT INTO company (ID,PERSON,PHONE,EMAIL)\
VALUES (5, 'TOM', 6000,'6000@qq.com' )")
<sqlite3.Cursor at 0x7f3bc7374040>
cursor.execute("SELECT id,person FROM company LIMIT 3 ;")
cursor.fetchall()
[(1, 'Paul'), (2, 'Allen'), (3, 'Teddy')]
cursor.execute("SELECT id,person FROM company WHERE person LIKE '%a_k%' ;")
cursor.fetchall()
[(4, 'Mark')]
cursor.execute(" SELECT * FROM company ORDER BY id ASC;")
cursor.fetchall()
[(1, 'Paul', '2000000', '2000000@qq.com'), (2, 'Allen', '1500000', '1500000@qq.com'), (3, 'Teddy', '2500000', '2500000@qq.com'), (4, 'Mark', '6500000', '6500000@qq.com'), (5, 'TOM', '6000', '6000@qq.com')]
cursor.execute(" SELECT * FROM company ORDER BY phone DESC;")
cursor.fetchall()
[(4, 'Mark', '6500000', '6500000@qq.com'), (5, 'TOM', '6000', '6000@qq.com'), (3, 'Teddy', '2500000', '2500000@qq.com'), (1, 'Paul', '2000000', '2000000@qq.com'), (2, 'Allen', '1500000', '1500000@qq.com')]
conn.close()