Python学习第十七天
Django框架-SQLite3
介绍
Django内置了对 SQLite3 数据库的支持。SQLite3 是一个轻量级的嵌入式数据库引擎,非常适合开发、测试和小型项目。以下是关于 Django 中 SQLite3 的介绍和应用指南。(除了这些还支持mysql、oracle以及其他查询文档,本质上是一个内置数据库并且它是一个文件数据库,无需安装直接可以使用)
链接工具
命令行工具-sqlite
安装
注意了我们安装的算是一个工具只是对于sqlite3数据库的一个命令行管理工具。(也可以使用datagrip或者其他的工具)
下载地址
下载后需要注意对应的解压包中需要有.exe文件
使用sqlite3
配置环境变量将sqlite3.exe配置到path中就可以在cmd命令随时使用了
使用.help查看帮助指令
使用
常用的命令
类型 | 命令/语句 | 说明 |
---|---|---|
命令行命令 | .help | 显示所有 SQLite3 命令行命令的帮助信息。 |
.tables | 列出当前数据库中的所有表。 | |
.schema [表名] | 显示指定表的创建语句。如果不指定表名,则显示所有表的创建语句。 | |
.databases | 列出当前连接的数据库文件。 | |
.exit 或 .quit | 退出 SQLite3 命令行工具。 | |
.mode MODE | 设置输出模式(如 csv , column , line , list 等)。 | |
.headers on/off | 开启或关闭查询结果的列名显示。 | |
.output FILENAME | 将输出重定向到指定文件。 | |
.import FILE TABLE | 将文件中的数据导入到指定表中。 | |
.show | 显示当前 SQLite3 的配置(如输出模式、分隔符等)。 | |
.dump [表名] | 导出数据库或指定表的 SQL 语句(用于备份)。 | |
.read FILENAME | 执行指定文件中的 SQL 语句。 | |
.open FILENAME | 打开或切换到指定的数据库文件。 | |
.backup DBNAME FILE | 备份数据库到指定文件。 | |
.restore DBNAME FILE | 从指定文件恢复数据库。 | |
SQL 语句 | CREATE TABLE 表名 (列定义); | 创建表。例如:CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT); |
DROP TABLE 表名; | 删除表。 | |
INSERT INTO 表名 (列) VALUES (值); | 插入数据。例如:INSERT INTO users (name) VALUES ('Alice'); | |
SELECT 列 FROM 表名 [WHERE 条件]; | 查询数据。例如:SELECT * FROM users WHERE id = 1; | |
UPDATE 表名 SET 列=值 [WHERE 条件]; | 更新数据。例如:UPDATE users SET name='Bob' WHERE id = 1; | |
DELETE FROM 表名 [WHERE 条件]; | 删除数据。例如:DELETE FROM users WHERE id = 1; | |
ALTER TABLE 表名 ADD COLUMN 列定义; | 添加列。例如:ALTER TABLE users ADD COLUMN age INTEGER; | |
BEGIN TRANSACTION; | 开始事务。 | |
COMMIT; | 提交事务。 | |
ROLLBACK; | 回滚事务。 | |
PRAGMA 指令; | 执行 PRAGMA 指令。例如:PRAGMA table_info(users); 显示表结构信息。 |
常用工具-datagrip
链接
因为他是一个文件型数据库,那么使用这个工具去查询创建就没什么可以说的了。常用的查询create都可以。
使用
其他工具navicat、PyCharm中自带的database、dbserver都可以一样的只要把驱动下载下来都可以使用。
使用
建表:
-- 使用datagrip 直接创建或者sqlite命令行工具创建都可以
create table t_user(
id INTEGER PRIMARY KEY AUTOINCREMENT, -- 自增主键
username varchar(100),
password varchar(100),
sex varchar(1)
);
# db相关操作
from django.db import connection
# 获取游标对象 使用游标对象还记得之前的db相关的操作嘛 直接创建表
cursor = connection.cursor()
myapp下的views下增加success和register方法
# django最新版5.1
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
#引入render
from django.shortcuts import render,redirect
from datetime import datetime
from django.db import connection
# 获取游标对象
cursor = connection.cursor()
# 定义一个文字或者html的元素或者标签
# postman请求时必须添加csrf_exempt否则会返回403
# 当你在Postman中测试POST请求时,如果没有手动添加 CSRF Token,Django 会认为这是一个潜在的 CSRF 攻击,因此返回 403 Forbidden 错误。
@csrf_exempt
def index(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
retStr = f"<span style='font-size:48px;'>POST 我请求测试参数:username={username} password = {password}</span>"
print(retStr)
else:
pwd = request.GET.get('pwd')
retStr = "Get请求测试参数:%s" %pwd
return HttpResponse(retStr)
# 指向myindex.html
def myindex(request):
# 第三个参数为键值对传递 传递上下文或者返回的数据 使用前端接受参数时 类似于java的template也有一个基于模版前端的{{name}}
list = [{"name":"django","age":"18"},{"name":"java","age":"18"},{"name":"python","age":"18"}]
return render(request, 'myindex.html',
{"name":"",
"list":list,
"ifkey":"django",
"testdate":datetime.strptime('2025-03-15',"%Y-%m-%d")}
)
def register(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
sex = request.POST.get('sex')
print("username:"+username,"password:"+password,"sex:"+sex)
# 保存用户数据到 t_user 表
cursor.execute(" insert into t_user(username,password,sex) values(%s,%s,%s)",(username,password,sex))
connection.commit()
return redirect('success') # 注册成功后跳转到成功页面
else:
pass
return render(request, 'register.html', {'form': []})
def success(request):
return render(request, 'success.html')
myapp下的template中增加register和success以及myindex作为了主页增加了注册的超链接
register.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>User Registration</title>
<!-- 引入 Bootstrap 5 CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet">
<!-- 自定义 CSS -->
<style>
body {
background-color: #f8f9fa;
font-family: 'Arial', sans-serif;
}
.register-container {
max-width: 500px;
margin: 100px auto;
padding: 30px;
background: #ffffff;
border-radius: 10px;
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1);
}
.register-container h2 {
text-align: center;
margin-bottom: 20px;
color: #333;
font-weight: bold;
}
.form-control {
border-radius: 5px;
padding: 10px;
border: 1px solid #ddd;
margin-bottom: 15px;
}
.form-control:focus {
border-color: #007bff;
box-shadow: 0 0 5px rgba(0, 123, 255, 0.25);
}
.btn-primary {
width: 100%;
padding: 10px;
border-radius: 5px;
background-color: #007bff;
border: none;
font-size: 16px;
}
.btn-primary:hover {
background-color: #0056b3;
}
.alert {
border-radius: 5px;
margin-bottom: 20px;
}
.text-danger {
font-size: 14px;
margin-top: 5px;
}
</style>
</head>
<body>
<div class="register-container">
<h2>Register</h2>
<form method="post" action="{% url 'register' %}">
{% csrf_token %} <!-- CSRF 令牌,防止跨站请求伪造攻击 -->
<!-- 显示表单错误 -->
{% if form.errors %}
<div class="alert alert-danger">
<strong>Error!</strong> Please correct the errors below.
</div>
{% endif %}
<!-- Username 字段 -->
<div class="form-group">
<label for="id_username" class="form-label">Username</label>
<input type="text" name="username" id="id_username" class="form-control" value="{{ form.username.value|default_if_none:'' }}" required>
{% if form.username.errors %}
<div class="text-danger">
{{ form.username.errors }}
</div>
{% endif %}
</div>
<!-- Password 字段 -->
<div class="form-group">
<label for="id_password" class="form-label">Password</label>
<input type="password" name="password" id="id_password" class="form-control" required>
{% if form.password.errors %}
<div class="text-danger">
{{ form.password.errors }}
</div>
{% endif %}
</div>
<!-- Sex 字段 -->
<div class="form-group">
<label for="id_sex" class="form-label">Sex</label>
<select name="sex" id="id_sex" class="form-control" required>
<option value="">Select Sex</option>
<option value="M" {% if form.sex.value == "M" %}selected{% endif %}>Male</option>
<option value="F" {% if form.sex.value == "F" %}selected{% endif %}>Female</option>
<option value="O" {% if form.sex.value == "O" %}selected{% endif %}>Other</option>
</select>
{% if form.sex.errors %}
<div class="text-danger">
{{ form.sex.errors }}
</div>
{% endif %}
</div>
<!-- 提交按钮 -->
<div class="form-group">
<button type="submit" class="btn btn-primary">Register</button>
</div>
</form>
</div>
<!-- 引入 Bootstrap 5 JS(可选) -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>
success.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Registration Successful</title>
<!-- 引入 Bootstrap 5 CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet">
<!-- 自定义 CSS -->
<style>
body {
background-color: #f8f9fa;
font-family: 'Arial', sans-serif;
}
.success-container {
max-width: 500px;
margin: 100px auto;
padding: 30px;
background: #ffffff;
border-radius: 10px;
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1);
text-align: center;
}
.success-container h2 {
color: #28a745;
font-weight: bold;
margin-bottom: 20px;
}
.btn-primary {
padding: 10px 20px;
border-radius: 5px;
background-color: #007bff;
border: none;
font-size: 16px;
}
.btn-primary:hover {
background-color: #0056b3;
}
</style>
</head>
<body>
<div class="success-container">
<h2>恭喜您注册成功</h2>
<p>感谢您的注册.</p>
<a href="{% url 'register' %}" class="btn btn-primary">注册其他用户</a>
</div>
<!-- 引入 Bootstrap 5 JS(可选) -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>
myindex.html
<span style = 'font-size: 48px;'>
<a href='http://127.0.0.1:8000/register/'>注册</a>
</span>
utils.py内容变更
from django.urls import path
from . import views
urlpatterns = [
path("index/", views.index, name="index"),
path("myindex/", views.myindex, name="myindex"),
path('register/', views.register, name='register'),
path('success/', views.success, name='success'),
]
后续把代码传到github仓库上