Django笔记:连接数据库并执行SQL语句

Django中安装好数据库和对应的数据库驱动之后,就可以直接执行sql语句进行数据库和表的创建,以及数据的增删改查等操作,在python3中,可以使用的数据库和驱动有多种,我这里使用的是MysqL数据库,对应的驱动使用的是MysqLclient,安装时直接使用pip install MysqLclient安装即可。

一、MysqL数据库驱动

对于Python中使用的MysqL驱动,以下几种可以参考下:

二、连接数据库

安装好MysqL数据库及其驱动后,只需要在项目主app的settings.py修改配置项DATABASESdefault项信息即可,之后运行Django项目时就可以自动连接数据库了。具体配置方法参考示例:

DATABASES = {
    'default': {
        # 数据库引擎
        'ENGINE': 'django.db.backends.MysqL',# 数据库名称
        'NAME': 'django_db1',# 用户名
        'USER': 'root',# 密码
        'PASSWORD': '123456',# 数据库所在的主机IP(本机就是127.0.0.1)
        'HOST': '127.0.0.1',# 数据库使用的端口号(MysqL认端口号就是3306)
        'PORT': '3306'
    }
}

三、执行sql语句

Django中有两种方式来操作数据库,一种是通过ORM模型,另一种就是直接执行sql语句,这里讲一下直接执行sql的方式。
直接执行sql的方式需要用到from django.db import connection,并通过connection.cursor()方法获取数据库的游标对象,然后使用游标对象的方法来执行对应的sql即可。直接执行sql的这种方式遵循Python DB API的规范,而对于遵循这个规范的数据库驱动来说,它们使用的方法都是一样的,不同之处在于方法内部的实现原理,比如executefetchall方法,这些方法不只是Django中才有,只要是遵循Python DB API规范实现的驱动都会有这些方法,只是各自的实现原理不同而已。这个规范具体有哪些方法,可以参考Python官方文档Python DB API,这里列举一些常用的方法

  • description:如果cursor执行了查询sql,那么cursor.description将返回一个列表,列表中的元素为元组(name,type_code,display_size,internal_size,precision,scale,null_ok)
  • rowcount:表示执行了sql后受影响的行数。
  • close关闭游标。
  • execute(sql[,parameters]):执行sql。执行sql的时候如果需要传递参数,则可以使用parameters参数,例如cursor.execute("select * from article where id=%s",(1,))。当然,也可以先将sql字符串构造好后直接传入。
  • fetchone:在执行了查询操作后,获取查询结果的第一条数据。
  • fetchmany(size):在执行了查询操作后,获取指定条数的数据,如果不指定size参数,则获取第一条数据。
  • fetchall获取所有sql执行结果。

示例:通过sql的方式操作数据库

from django.shortcuts import render
from django.db import connection


def index(request):
    # 创建获取游标对象
    cursor = connection.cursor()
    # 使用游标对象的execute方法执行一条sql语句
    # cursor.execute("insert into book(id,name,author) values(null,'了不起的盖茨比','弗朗西斯·斯科特·基·菲茨杰拉德')")
    cursor.execute("select id,author from book")
    # 如果执行的查询sql,则可以指定方法获取查询的结果
    # fetchall方法获取所有的查询结果
    rows = cursor.fetchall()
    for row in rows:
        print(row)
    return render(request,'index.html')

注:本文为学习笔记,发现错误欢迎指出。

相关文章

1. General Supported Versions 2. Settings STATIC_URL MED...
问题01:Django枚举类型扩展方法(Model.get_FOO_display()) ...
verbose_name 可以作为第一个参数传入,使书写更加工整和有序...
# use_2to3 is invalid
# Django枚举类型扩展方法&a...
一、层次结构 GenericViewSet(ViewSetMixin, generics.Gener...