操作数据库

145 阅读3分钟

简单操作数据库

数据库连接

在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')
]