概述
文章目录
- 简介
- 安装
- 初试
- 联表查询
- 简单封装
- 数据类型
- 遇到的坑
- 参考文献
简介
SQLite 是一款 C 语言实现的小型、快速、自包含、高可用、功能齐全的SQL数据库引擎。
SQLite 是一个基于文件的关系型数据库,只有一个文件,却能储存最多 140TB 的数据。
SQLite 是世界上使用最广泛的数据库。
SQLite 内置于大多数手机和计算机中,并捆绑在人们每天使用的无数应用程序中。
SQLite 的文件格式是稳定的、跨平台的、向后兼容的,开发者承诺将其保持到2050年。
SQLite 数据库文件通常被用作容器,在系统之间传输丰富的内容,并作为数据的长期存储格式。目前有超过1万亿的 SQLite 数据库正在使用中。
SQLite 的源代码属于公共,每个人可以出于任何用途免费使用。
不适合使用 SQLite 的情况:
- 程序和数据分离,且它们通过互联网连接
- 高并发写入
- 数据量非常大
安装
Linux / MacOS 自带 SQLite
初试
商品表 Product
代码
import os
import sqlite3
if os.path.exists('database.db'):
os.remove('database.db') # 存在则删掉,避免重复添加
# 创建数据库和表
conn = sqlite3.connect('database.db')
c = conn.cursor()
sql = '''
CREATE TABLE IF NOT EXISTS `product`
(
`product_id` CHAR(4) PRIMARY KEY NOT NULL,
`product_name` VARCHAR(100) NOT NULL,
`product_type` VARCHAR(32) NOT NULL,
`sale_price` INTEGER,
`purchase_price` INTEGER,
`regist_date` DATE
);
'''
c.execute(sql)
# 增
sql = 'INSERT INTO `product` (`product_id`, `product_name`, `product_type`, `sale_price`, `purchase_price`, `regist_date`) VALUES (?, ?, ?, ?, ?, ?)'
datas = [
('0001', 'T恤衫', '衣服', 1000, 500, '2009-09-20'),
('0002', '打孔器', '办公用品', 500, 320, '2009-9-11'),
('0003', '运动T恤', '衣服', 4000, 2800, None),
('0004', '菜刀', '厨房用具', 3000, 2800, '2009-9-20'),
('0005', '高压锅', '厨房用具', 6800, 5000, '2009-1-15'),
('0006', '叉子', '厨房用具', 500, None, '2009-9-20'),
('0007', '擦菜板', '厨房用具', 880, 790, '2008-4-28'),
('0008', '圆珠笔', '办公用品', 100, None, '2009-11-11')
]
affected_rows = c.executemany(sql, datas).rowcount
print('插入{}条数据'.format(affected_rows))
# 删
sql = 'DELETE FROM `product` WHERE `product_id`=?'
affected_rows = c.execute(sql, ('0001',)).rowcount
print('删除{}条数据'.format(affected_rows))
# 改
sql = 'UPDATE `product` SET `regist_date`=? WHERE `product_id`=?'
affected_rows = c.execute(sql, ('2009-10-10', '0003')).rowcount
print('修改{}条数据'.format(affected_rows))
# 查
sql = 'SELECT * FROM `product`'
all_rows = c.execute(sql).fetchall()
for row in all_rows:
print(row)
conn.close()
联表查询
商品表 Product
商店商品表 ShopProduct
import os
import sqlite3
if os.path.exists('database.db'):
os.remove('database.db') # 存在则删掉,避免重复添加
# 创建数据库和表
conn = sqlite3.connect('database.db')
c = conn.cursor()
sql = '''
CREATE TABLE IF NOT EXISTS `product`
(
`product_id` CHAR(4) PRIMARY KEY NOT NULL,
`product_name` VARCHAR(100) NOT NULL,
`product_type` VARCHAR(32) NOT NULL,
`sale_price` INTEGER,
`purchase_price` INTEGER,
`regist_date` DATE
);
'''
c.execute(sql)
sql = '''
CREATE TABLE IF NOT EXISTS `shopproduct`
(
shop_id CHAR(4) NOT NULL,
shop_name VARCHAR(100) NOT NULL,
product_id CHAR(4) NOT NULL,
quantity INTEGER
);
'''
c.execute(sql)
# 增
sql = 'INSERT INTO `product` (`product_id`, `product_name`, `product_type`, `sale_price`, `purchase_price`, `regist_date`) VALUES (?, ?, ?, ?, ?, ?)'
datas = [
('0001', 'T恤衫', '衣服', 1000, 500, '2009-09-20'),
('0002', '打孔器', '办公用品', 500, 320, '2009-9-11'),
('0003', '运动T恤', '衣服', 4000, 2800, None),
('0004', '菜刀', '厨房用具', 3000, 2800, '2009-9-20'),
('0005', '高压锅', '厨房用具', 6800, 5000, '2009-1-15'),
('0006', '叉子', '厨房用具', 500, None, '2009-9-20'),
('0007', '擦菜板', '厨房用具', 880, 790, '2008-4-28'),
('0008', '圆珠笔', '办公用品', 100, None, '2009-11-11')
]
c.executemany(sql, datas)
sql = 'INSERT INTO `shopproduct` (`shop_id`, `shop_name`, `product_id`, `quantity`) VALUES (?, ?, ?, ?)'
datas = [
('000A', '东京', '0001', 30),
('000A', '东京', '0002', 50),
('000A', '东京', '0003', 15),
('000B', '名古屋', '0002', 30),
('000B', '名古屋', '0003', 120),
('000B', '名古屋', '0004', 20),
('000B', '名古屋', '0006', 10),
('000B', '名古屋', '0007', 40),
('000C', '大阪', '0003', 20),
('000C', '大阪', '0004', 50),
('000C', '大阪', '0006', 90),
('000C', '大阪', '0007', 70),
('000D', '福冈', '0001', 100)
]
c.executemany(sql, datas)
# 联表查询
sql = '''
SELECT SP.shop_id, SP.shop_name, SP.product_id, P.product_name
FROM `shopproduct` AS SP
INNER JOIN `product` AS P
ON SP.product_id = P.product_id;
'''
all_rows = c.execute(sql).fetchall()
for row in all_rows:
print(row)
conn.close()
简单封装
import sqlite3
conn = sqlite3.connect('database.db')
c = conn.cursor()
sql = '''
CREATE TABLE IF NOT EXISTS `tasks`
(
`id` INTEGER UNIQUE PRIMARY KEY AUTOINCREMENT,
`name` TEXT,
`countdown` INTEGER
);
'''
c.execute(sql) # 创建数据库
def create(name='job', countdown=5):
"""增"""
sql = 'INSERT INTO `tasks` (`name`, `countdown`) VALUES (?, ?)'
c.execute(sql, (name, countdown))
conn.commit()
return c.lastrowid
def delete(id, verbose=False):
"""删"""
sql = 'DELETE FROM `tasks` WHERE `id`=?'
affected_rows = c.execute(sql, (id,)).rowcount
if verbose:
print('已删除{}行数据'.format(affected_rows))
conn.commit()
def update(id, countdown):
"""改"""
sql = 'UPDATE `tasks` SET `countdown`=? WHERE `id`=?'
c.execute(sql, (countdown, id))
conn.commit()
def read(id=None, verbose=False):
"""查"""
sql = 'SELECT * FROM `tasks` '
if id:
sql = 'SELECT * FROM `tasks` WHERE `id`={}'.format(id)
all_rows = c.execute(sql).fetchall()
if verbose:
print(all_rows)
return all_rows
数据类型
Python数据类型 | SQLite数据类型 | 描述 |
---|---|---|
datetime.date | date | 日期 |
datetime.datetime | timestamp | 日期+时间 |
None | NULL | 空值 |
int | INTEGER | 整数 |
float | REAL | 浮点数 |
str | TEXT | 文本字符串 |
Any | BLOB | 数据块,按输入原样存储 |
详细阅读:
- Datatypes In SQLite Version 3
- SQLite3的数据类型
遇到的坑
1. 报错 sqlite3.ProgrammingError: SQLite objects created in a thread can only be used in that same thread.
调用 sqlite3.connect('database.db')
时添加参数 check_same_thread=False
参考文献
- SQLite – Python | 菜鸟教程
- sqlite3 Documentation
- SQLite 官网
- Appropriate Uses For SQLite
- 一日一技:这个数据库用起来刚刚好
最后
以上就是典雅烤鸡为你收集整理的Python SQLite入门简介安装初试联表查询简单封装数据类型遇到的坑参考文献的全部内容,希望文章能够帮你解决Python SQLite入门简介安装初试联表查询简单封装数据类型遇到的坑参考文献所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复