python操作sqlite数据库

介绍

操作流程:

  1. 导入 sqlite3 模块,python内置该模块
  2. 连接数据库
  3. 获取 cursor 游标
  4. 通过 cursor 游标执行 查询语句,获取结果
  5. 通过 cursor 游标执行 增删改sql语句,提交事务
  6. 关闭游标
  7. 关闭链接

代码模板:

import sqlite3

# 连接数据库
conn = sqlite3.connect("student.db")

print("conn:",conn) # CMySQLConnection
# 获取游标
cursor = conn.cursor()

# 通过游标执行sql语句
cursor.execute(sql)

# 如果是增删改操作,需要提交事务 或 回滚事务
conn.commit()

# 游标及时关闭
cursor.close()
# 关闭数据库
conn.close()

User表相关操作

User 表是保存登录相关信息的表

创建user表

import sqlite3

# 连接数据库
conn = sqlite3.connect("student.db")

print("conn:",conn) 
# 获取游标
cursor = conn.cursor()

sql = '''
CREATE TABLE `user` (
  `id` int NOT NULL,
  `username` varchar(64) ,
  `password` varchar(64),
  PRIMARY KEY (`id`)
) 
'''
# 通过游标执行sql语句
cursor.execute(sql)

# 游标及时关闭
cursor.close()
# 关闭数据库
conn.close()

插入数据

import sqlite3

# 连接数据库
conn = sqlite3.connect("student.db")

print("conn:",conn) # CMySQLConnection
# 获取游标
cursor = conn.cursor()

# sql = "insert into user(id,username,password) values (1,'lilei','123456')"
sql = "insert into user(id,username,password) values (2,'hanmeimei','111111')"
# 通过游标执行sql语句
cursor.execute(sql)
# 提交事务
conn.commit()

# 游标及时关闭
cursor.close()
# 关闭数据库
conn.close()

登录(缺陷)

原理:根据 用户名密码 进行查询,能够 查询到就说明登录成功;查询不到就说明 用户名不存在或者密码错误

import sqlite3

username = 'lilei'
password = '123456'
# 连接数据库
conn = sqlite3.connect("student.db")

print("conn:",conn) # CMySQLConnection
# 获取游标
cursor = conn.cursor()

sql = "select * from user where username='{}' and password = '{}'".format(username,password)
print("sql:",sql)

# 通过游标执行sql语句
cursor.execute(sql)
res = cursor.fetchall()
for item in res:
    print(item)
# 游标及时关闭
cursor.close()
# 关闭数据库
conn.close()

登录的bug

当用户名是下面内容的时候,不需要输入密码,也能登录:

username = "lilei' --"
username = "' or 1=1 --"

因为 -- 表示注释,相当于 python中的 #,后面内容被注释掉了

登录(占位符)

username = 'lilei'
# username = "lilei' --"
# username = "' or 1=1 --"
password = '123456'
# 连接数据库
conn = sqlite3.connect("student.db")

print("conn:",conn) # CMySQLConnection
# 获取游标
cursor = conn.cursor()

# 使用 ? 作为占位符
sql = "select * from user where username=? and password = ?"
print("sql:",sql)

# 通过游标执行sql语句,内部会将后面的数据替换掉 ? 
cursor.execute(sql,(username,password))
res = cursor.fetchall()
for item in res:
    print(item)
# 游标及时关闭
cursor.close()
# 关闭数据库
conn.close()

Student相关表

创建表

import sqlite3

# 连接数据库
conn = sqlite3.connect("student.db")

print("conn:",conn) # CMySQLConnection
# 获取游标
cursor = conn.cursor()

sql = '''
CREATE TABLE `student` (
  `id` int NOT NULL,
  `name` varchar(64) ,
  `age` int DEFAULT NULL,
  `sex` varchar(16) ,
  PRIMARY KEY (`id`)
) 
'''
# 通过游标执行sql语句
cursor.execute(sql)

# 游标及时关闭
cursor.close()
# 关闭数据库
conn.close()

插入数据

import sqlite3

# 连接数据库
conn = sqlite3.connect("student.db")

print("conn:",conn) # CMySQLConnection
# 获取游标
cursor = conn.cursor()

# sql = "insert into student(id,name,age,sex) values (1,'李雷',20,'男')"
sql = "insert into student(id,name,age,sex) values (2,'韩梅梅',19,'女')"
# 通过游标执行sql语句
cursor.execute(sql)
# 提交事务
conn.commit()

# 游标及时关闭
cursor.close()
# 关闭数据库
conn.close()

查询

import sqlite3

# 连接数据库
conn = sqlite3.connect("student.db")

print("conn:",conn) # CMySQLConnection
# 获取游标
cursor = conn.cursor()

sql = "select * from student"
# 通过游标执行sql语句
cursor.execute(sql)
res = cursor.fetchall()
for item in res:
    print(item)
# 游标及时关闭
cursor.close()
# 关闭数据库
conn.close()

修改

import sqlite3

# 连接数据库
conn = sqlite3.connect("student.db")

print("conn:",conn) # CMySQLConnection
# 获取游标
cursor = conn.cursor()
sql = "update student set age = 25 where id=2"
# 通过游标执行sql语句
cursor.execute(sql)
# 提交事务
conn.commit()

# 游标及时关闭
cursor.close()
# 关闭数据库
conn.close()

删除

import sqlite3

# 连接数据库
conn = sqlite3.connect("student.db")

print("conn:",conn) # CMySQLConnection
# 获取游标
cursor = conn.cursor()
sql = "delete from student where id=1"
# 通过游标执行sql语句
cursor.execute(sql)
# 提交事务
conn.commit()

# 游标及时关闭
cursor.close()
# 关闭数据库
conn.close()

原文出处:https://malaoshi.top/show_1IX5XobBJ7cw.html