简单操作数据库
数据库连接
在settings.py下的DATABASES中设置,示例如下:
DATABASES = {
'default': {
#数据库引擎
'ENGINE': 'django.db.backends.mysql',
#数据库的名字
'NAME': 'django_db1',
#连接数据库的用户名
'USER': 'root',
#连接数据可的用户密码
'PASSWORD' : 'root',
#数据库的主机地址
'HOST' : '127.0.0.1',
#数据库的端口号
'PORT' : '3306'
}
}
操作数据库
在python中操作数据库有两种方式,第一种方式就是使用原生sql语句操作,第二种就是使用ORM模型来操作。
在Django中使用原生sql语句就是使用python db api 的接口操作。由数据库驱动提供操作,但是函数接口是一样的,我们只要使用封装好的接口就行了,示例如下:
from django.shortcuts import render
from django.db import connection
def index(request):
#获取游标对象
cursor = connection.cursor()
#写入数据库
cursor.execute("insert into book(id,name,author) values(null,'三国演义','罗贯中')")
#拿到游标对象执行sql语句
cursor.execute("select id,name,author from book")
#获取所有数据
rows = cursor.fetchall()
return render(request,'index.html')
python DB API 下cursor对象常用接口:
1.description:如果cursor执行了查询的sqi代码,那么读取该属性时,会返回一个列表,装的是元组,装的是数据信息。
2.rowcount:代表的是执行了sql语句后受影响的行数。
3.execute(sql[,parameters]):执行某个sql语句。
4.fetchone:在执行查询数据以后,获取第一条数据。
5.close:关闭游标。
6.fetchmany(size): 执行查询数据时,获取size条数据。
7.fetchall: 获取所有满足sql语句的数据。
数据库操作
创建一个简单的图书管理系统
1.新建一个名为front的app,在setting中注册它
2.在front视图函数中添加基本功能,并在urls中进行映射
3.创建数据库连接
4.添加base模板,将重复的模板视图写入,如下:
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>图书管理系统</title>
<link rel="stylesheet" href="{% static 'front/base.css' %}">
</head>
<body>
<nav>
<ul class="nav">
<li><a href="/">首页</a> </li>
<li><a href="{% url 'add_book' %}">发布图书</a> </li>
</ul>
</nav>
{% block content %}
{% endblock %}
</body>
</html>
5.在静态文件夹下添加base.css,为base进行设置,如下:
/*
*:所有标签设置
margin:外边距
padding:内边距
*/
*{
margin: 0;
padding: 0;
}
/*
nav盒子
overflow:是否浮动
*/
.nav{
background: #3a3a3a;
height: 65px;
overflow: hidden;
}
/*
nav下li标签文本设置
float:浮动
list—style:li标签风格样式
margin:外边距
line-height:文本高度
*/
.nav li{
float: left;
list-style: none;
margin: 0 20px;
line-height:65px;
}
/*
a标签下的文本设置
text-decoration:下划线
*/
.nav li a{
color: #ffffff;
text-decoration: none;
}
/*
点击时的风格样式
*/
.nav li a:hover{
color: lightblue;
}
6.编写首页模板,如下:
{% extends 'base.html' %}
{% block content %}
<table>
<thead>
<tr>
<th>序号</th>
<th>书名</th>
<th>作者</th>
</tr>
</thead>
<tbody>
{% for book in books %}
<tr>
<td>{{ forloop.counter }}</td>
<td><a href="{% url 'book_detail' id=book.0 %}">{{ book.1 }}</a></td>
<td>{{ book.2 }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}
7.编写新增图书模板,将表单信息传递到add_book的url,如下:
{% extends 'base.html' %}
{% block content %}
<form action="" method="post">
<table>
<tbody>
<tr>
<td>书名:</td>
<td><input type="text" name="name"></td>
</tr>
<tr>
<td>作者:</td>
<td><input type="text" name="author"></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="提交"></td>
</tr>
</tbody>
</table>
</form>
{% endblock %}
8.编写删除图书详情模块,如下:
from django.shortcuts import render,redirect,reverse
from django.db import connection
def get_cursor():
return connection.cursor()
def index(request):
cursor = get_cursor()
#从book数据库获取图书id,name,author
cursor.execute("select id,name,author from book")
#返回所有图书信息,格式[(id,name,author)...]
books = cursor.fetchall()
return render(request,'index.html',context={'books':books})
def add_book(request):
#接收增加图书页面传递来的信息
if request.method =='GET':
return render(request,'add_book.html')
else:
'获取返回信息'
name = request.POST.get('name')
author = request.POST.get('author')
cursor = get_cursor()
#写入book数据库
cursor.execute("insert into book(id,name,author) values(null,'%s','%s')"%(name,author))
#跳转到首页
return redirect(reverse('index'))
def book_detail(request,id):
cursor = get_cursor()
cursor.execute("select id,name,author from book where id=%s"%(id))
book = cursor.fetchone()
return render(request,'book_detail.html',context={'book':book})
def delete_book(request):
if request.method == 'POST':
id = request.POST.get('id')
cursor = get_cursor()
#删除数据库中该id的书
cursor.execute("delete from book where id=%s"%id)
return redirect(reverse('index'))
else:
raise RuntimeError("删除图书的method错误")
urls映射如下:
from django.urls import path
from front import views
urlpatterns = [
path('', views.index,name='index'),
path('add_book/', views.add_book, name='add_book'),
path('book_detail/<int:id>', views.book_detail, name='book_detail'),
path("delete_book/",views.delete_book,name='delete_book')
]