基于Python+Sqlite3实现最简单的CRUD
一、基本描述
使用Python,熟悉sqlite3的基本操作(查插删改),以及基本数据类型、事务(ACID)。
准备工作:在sqlite3的官网上下载预编译的sqlite文件(windows),包括tools和dll这两个文件。下载后,将它们解压后的文件放到一个文件夹中,并设置sqlite的环境变量。这样就可以直接在命令行打开sqlite3.exe。使用sqlite3.exe是为了方便操作,例如查看表、表头,以及实现交互式的数据库操作。
先使用命令行熟悉,sqlite3。第一步打开cmd,输入sqlite3进入sqlite的命令行模式,输入.open test.db可以创建数据库(open是打开数据库,但若目录下不存在相应文件则会自动创建)。然后输入以下命令新建一张很简单的user表,并插入一条记录。( Enter ".help" for instructions。Enter SQL statements terminated with a ";" 数据库描述和操作语言都需要加;作为命令的结束符)
create table user (
id varchar(20) primary key not null,
name varchar(20) not null); insert into user (id,name) values (1, 'paul');
此时可以使用.databases查看数据库,使用.tables查当前数据库中的表,也可以使用.schema user查看user表的关系模式。可以使用select语句查看数据。
select * from user;
可以使用begin;开始一个事务,例如执行插入、删除或更新一条记录,然后执行commit;或rollback;, rollback指令会将上一次事务结束(就是commit或rollback后)的所有数据库操作回滚,恢复至上一次事务结束的状态。

二、简易程序
首先在python中首先创建数据库文件test.db,同样的,若目录下不存在相应文件则会自动创建。
import os
import sqlite3 #导入SQLite驱动: def create_table(db_name):
#连接到SQlite数据库 'test.db',创建数据库并新建一张表
conn = sqlite3.connect(db_name) #数据库文件是test.db,不存在,则自动创建
print("Database {} created successfully".format(db_name))
cursor = conn.cursor() # sqlite3中EXECTUEM命令,不区分大小写
cursor.execute('''create table user (
id varchar(20) primary key not null,
name varchar(20) not null);''')
cursor.close()
conn.commit()
conn.close()
print("Table {} created successfully".format('user'))
然后定义CRUD操作
def insert_info(db_name, values):
conn = sqlite3.connect(db_name) #数据库文件是test.db,不存在,则自动创建
cursor = conn.cursor()
#插入一条记录: cursor.execute('insert into user (id, name) values (\'1\', \'Michael\')')
cursor.execute("insert into user values (?, ?);", (values[0], values[1]))
print(cursor.rowcount) #通过rowcount获得插入的行数:reusult 1
cursor.close()
conn.commit() #提交事务begin commit rollback end transaction
print("Records created successfully")
conn.close() def select_info(db_name, id):
conn = sqlite3.connect(db_name) #数据库文件是test.db,不存在,则自动创建
cursor = conn.cursor()
cursor.execute('select * from user where id=?;', (id,))
values = cursor.fetchall() # rows of info
cursor.close()
conn.close()
print(values) def update_info(db_name, values):
conn = sqlite3.connect(db_name) #数据库文件是test.db,不存在,则自动创建
cursor = conn.cursor()
cursor.execute('update user set name=? where id=?;', (values[1], values[0]))
conn.commit()
cursor.close()
conn.close()
print("updated") def delete_info(db_name, id):
conn = sqlite3.connect(db_name) #数据库文件是test.db,不存在,则自动创建
cursor = conn.cursor()
cursor.execute('delete from user where id=?;', (id))
conn.commit()
print("Total number of rows deleted :", conn.total_changes) c = conn.execute('select * from user')
for row in c:
print("id: {}, name: {}".format(row[0], row[1])) c.close()
cursor.close()
conn.close()
print("delete done successfully") def show_all(db_name):
conn = sqlite3.connect(db_name)
c = conn.execute('select * from user')
cnt = 1
for row in c:
print("id:{}, name:{}".format(row[0], row[1]), end=" ")
if cnt % 3 == 0:
print("")
cnt += 1 c.close()
conn.close()
最后是主程序:
def main():
db_name = 'test.db'
root_path = os.path.split(os.path.realpath(__file__))[0] + os.sep
file_path = root_path + db_name
print(file_path) cwd_path = os.getcwd()
print("Current Python Working Directory is " + cwd_path)
os.chdir(root_path) # 将python的工作目录切换到源文件所在目录
print("\nChange Directory to:", root_path) if not os.path.exists(file_path):
create_table(db_name) # 检查db文件
else:
print("{} file exist already!".format(db_name)) flag = True # 指示位,控制循环
operation = 0 # 操作码, 代表各种操作
op_table = ["Select", "Insert", "Update", "Delete", "ShowAll"]
op_idx = {op:i for i, op in enumerate(op_table)}
idx_op = {i:op for i, op in enumerate(op_table)}
print("\nTest Sqlite3")
while flag != False:
for key, val in op_idx.items():
print("{}:{} ".format(key, val), end=" ") oper = input("\nPlease input your choice:")
oper = int(oper)
if 4 >= oper >= 0:
print("\nExecute {}".format(idx_op[oper]))
else:
print("Operation code {} error! Please retry!".format(oper))
continue if oper == 0:
print("Please input id for query") # select
query_id = input()
select_info(db_name, query_id)
elif oper == 1:
print("Please input id and name") # insert
text = input()
values = text.split(" ")
insert_info(db_name, values)
elif oper == 2:
print("Please input id and name") # update
text = input()
values = text.split(" ")
update_info(db_name, values)
elif oper == 3:
print("Please input id for delelte") # delete
del_id = input()
delete_info(db_name, del_id)
elif oper == 4:
show_all(db_name) sign = input("\nContinue or not,: 0 stop, 1 continue:")
if int(sign) == 0:
flag = False
print("Close Application") if __name__ == "__main__":
main()
基于Python+Sqlite3实现最简单的CRUD的更多相关文章
- 基于Python使用SVM识别简单的字符验证码的完整代码开源分享
关键字:Python,SVM,字符验证码,机器学习,验证码识别 1 概述 基于Python使用SVM识别简单的验证字符串的完整代码开源分享. 因为目前有了更厉害的新技术来解决这类问题了,但是本文作 ...
- Python 基于Python及zookeeper实现简单分布式任务调度系统设计思路及核心代码实现
基于Python及zookeeper实现简单分布式任务调度系统设计思路及核心代码实现 by:授客 QQ:1033553122 测试环境 功能需求 实现思路 代码实践(关键技术点实现) 代码模块组织 ...
- 如何简单实现接口自动化测试(基于 python) 原博主地址https://blog.csdn.net/gitchat/article/details/77849725
如何简单实现接口自动化测试(基于 python) 2017年09月05日 11:52:25 阅读数:9904 GitChat 作者:饿了么技术社区 原文:如何简单实现接口自动化测试(基于 python ...
- 一次简单完整的自动化登录测试-基于python+selenium进行cnblog的自动化登录测试
Web登录测试是很常见的测试,手动测试大家再熟悉不过了,那如何进行自动化登录测试呢!本文就基于python+selenium结合unittest单元测试框架来进行一次简单但比较完整的cnblog自动化 ...
- Websocket - Websocket原理(握手、解密、加密)、基于Python实现简单示例
一.Websocket原理(握手.解密.加密) WebSocket协议是基于TCP的一种新的协议.WebSocket最初在HTML5规范中被引用为TCP连接,作为基于TCP的套接字API的占位符.它实 ...
- 简单实现接口自动化测试(基于python+unittest)
简单实现接口自动化测试(基于python+unittest) 简介 本文通过从Postman获取基本的接口测试Code简单的接口测试入手,一步步调整优化接口调用,以及增加基本的结果判断,讲解Pytho ...
- 实用的Python(3)超简单!基于Python搭建个人“云盘”
1 简介 当我们想要从本地向云服务器上传文件时,比较常用的有pscp等工具,但避免不了每次上传都要写若干重复的代码,而笔者最近发现的一个基于Python的工具updog,可以帮助我们在服务器上搭建类似 ...
- python sqlite3简单操作
python sqlite3简单操作(原创)import sqlite3class CsqliteTable: def __init__(self): pass def linkSqlite3(sel ...
- 超简单!基于Python搭建个人“云盘”
1. 简介 当我们想要从本地向云服务器上传文件时,比较常用的有pscp等工具,但避免不了每次上传都要写若干重复的代码,而笔者最近发现的一个基于Python的工具updog,可以帮助我们在服务器上搭建类 ...
随机推荐
- mybatis两种嵌套查询方式
1,推荐用第一种 <select id="getTeacher2" resultMap="TeacherStudent"> select s.id ...
- SpringBoot如何优雅关闭(SpringBoot2.3&Spring Boot2.2)
SpringBoot如何优雅关闭(SpringBoot2.3&Spring Boot2.2) 优雅停止&暴力停止 暴力停止:像日常开发过程中,测试区或者本地开发时,我们并不会考虑项目关 ...
- 公众号走走看看——js
1.数字转换字符串/字符串转换数字 2.短循环 3.性能测试(执行时间) 4.交换值 5.合并数组(IE不兼容) 6.数组去重 7.判断给定参数是否是数字 8.获取最大最小值.取随机数(arr.len ...
- Flutter和iOS混编详解
前言 下面的内容是最近在使用Flutter和我们自己项目进行混编时候的一些总结以及自己踩的一些坑,处理完了就顺便把整个过程以及一些我们可能需要注意的点全都梳理出来,希望对有需要的小伙伴有点帮助,也方便 ...
- git 1.2
1.git服务器的搭建 gitlab 常用命令: gitlab-rails console -e production 进入控制台指令 sudo gitlab-ctl start # 启动所有 gi ...
- scanf("%d",a[i]+j)为什么不加取地址符号
为什么我画的地方不加取地址符号? 不要在意标题为什么不加分号,因为长度太长了! 二维数组a[3][5]中,a[3]储存的是下一维的地址,a[1]等同于&a[1][0] 同理,a[1]+1等于& ...
- Servlet表单数据
1.GET 方法 GET 方法向页面请求发送已编码的用户信息.页面和已编码的信息中间用 ? 字符分隔,如下所示: http://www.test.com/hello?key1=value1&k ...
- 给IDEA道个歉,这不是它的BUG,而是反编译插件的BUG。
你好呀,我是歪歪. 上周我不是发了<我怀疑这是IDEA的BUG,但是我翻遍全网没找到证据!>这篇文章吗. 主要描述了在 IDEA 里面反编译后的 class 文件中有这样的代码片段: 很明 ...
- Spring Ioc源码分析系列--Bean实例化过程(一)
Spring Ioc源码分析系列--Bean实例化过程(一) 前言 上一篇文章Spring Ioc源码分析系列--Ioc容器注册BeanPostProcessor后置处理器以及事件消息处理已经完成了对 ...
- 【Java面试】什么是幂等?如何解决幂等性问题?
一个在传统行业工作了7年的粉丝私信我. 他最近去很多互联网公司面试,遇到的很多技术和概念都没听过. 其中就有一道题是:"什么是幂等.如何解决幂等性问题"? 他说,这个概念听都没听过 ...