python的Web框架,Django的ORM,模型基础,MySQL连接配置及增删改查

<h1 id="django中的orm简介" data-source-line="1">Django中的ORM简介
<h5 id="orm概念对象关系映射object-relational-mapping简称orm" data-source-line="2">ORM概念:对象关系映射(Object Relational Mapping,简称ORM):
<p data-source-line="3">用面向对象的方式描述数据库,去操作数据库,甚至可以达到不用编写SQL语句就能够对数据库进行增删改查,进行各种操作。我们只需要对python的面向对象熟悉,就可以很清晰的知道各种数据之间的关系。


<p data-source-line="5">

<img src="https://www.jb51.cc/res/2019/03-02/09/d67f51edba8168eeff72e60a9814da2f.png" alt="">

<p data-source-line="7">django模型映射关系:<span class="Apple-converted-space"> 


<p data-source-line="7"><span class="Apple-converted-space">

<img src="https://www.jb51.cc/res/2019/03-02/09/cdbb9a56f47647ca1680de8e777642dc.png" alt="">

<h1 id="数据库连接配置" data-source-line="20">数据库连接配置
<p data-source-line="22">Django支持主流的数据库,都有配置,在setting中配置即可,下面我们看下如何配置MySQL。


<h4 id="dbsqlite3文件的说明" data-source-line="24">db.sqlite3文件的说明
<p data-source-line="25">db.sqlite3文件也是数据库文件,Django默认情况下,会配置这个文件,这个文件很小,很多单机、net的用的是这个<span class="Apple-converted-space"> 


<p data-source-line="25"><span class="Apple-converted-space">

<img src="https://www.jb51.cc/res/2019/03-02/09/ffc70fe2f393cb669f1d45db43be1249.png" alt="">

<h4 id="django-连接mysql的配置流程" data-source-line="28">Django 连接MySQL的配置流程:
<ul data-source-line="29">

  • 安装 pymysql,用于python操作mysql数据库
  • pip install pymysql

      创建数据库用户,需要有创建数据库权限的用户

    • 创建数据库

    
    
    >>>(django) pyvip@Vip:~$ mysql -uroot -pqwe123
    
    
    >>>mysql>1 row affected (0.00 sec)
      修改setting配置,
    默认的是:: DATABASES = : : : : : : }

    <ul data-source-line="62">

  • 修改项目文件夹(和setting.py文件所在的目录)下的__init__.py文件
  • 
    
    pymysql.install_as_MySQLdb()

    <ul data-source-line="73">

  • 设置时区
  • TIME_ZONE =

    <h1 id="模型的创建与映射激活" data-source-line="84">模型的创建与映射(激活)
    <h4 id="定义模型" data-source-line="85">定义模型
    <ol data-source-line="86">

  • 模型类必须写在app下的models.py文件中。
  • 模型如果需要映射到数据库,所在的app必须被安装。
  • 一个数据表对应一个模型类,表中的字段,对应模型中的类属性。
  • django.db name = models.CharField(max_length=20 age = models.SmallIntegerField(default= sex = models.SmallIntegerField(default=1 qq = models.CharField(max_length=20,default= phone = models.CharField(max_length=20,default= c_time = models.DateTimeField(verbose_name=,auto_now_add= % (self.name,self.age)
    =qq、phone给的CharField不用SmallIntegerField类型的,是因为字符串更好操作,不容易出错。</span></pre>

    <ol data-source-line="121">

  • 每一个模型都是django.db.models.Model的子类(类的继承)。
  • 每个模型都有许多的类变量,它会表示模型中的数据库字段。
  • 每一个字段都由一个字段类的实例来表示。
    1. 在项目中注册app
    INSTALLED_APPS = ]
      运行数据库迁移命令(一定要在项目根目录下) 告诉django,我们做了哪些数据库的更改

    (django) pyvip@Vip:~/code/<span style="color: #000000;">crm$ python manage.py makemigrations teacher
    Migrations <span style="color: #0000ff;">for <span style="color: #800000;">'<span style="color: #800000;">teacher<span style="color: #800000;">'<span style="color: #000000;">:
    teacher/migrations/<span style="color: #000000;">0001_initial.py
    - Create model Students

    <p data-source-line="143">运行成功后,会生成一个数据库迁移文件


    <p data-source-line="145">现在还没有真正的操作数据库


    <p data-source-line="147">

    <img src="https://www.jb51.cc/res/2019/03-02/09/80d96a0eea5d001e3316a2fa60ba922a.png" alt="">

    <p data-source-line="150">sqlmigrate,从迁移获取SQL语句


    <div class="cnblogs_code">

    
    

    (django) pyvip@Vip:~/code/crm$ python manage.py sqlmigrate teacher 0001<span style="color: #000000;">
    BEGIN;
    --
    --<span style="color: #000000;"> Create model Students
    --<span style="color: #000000;">
    CREATE TABLE teacher_students (id integer AUTO_INCREMENT NOT NULL PRIMARY KEY,name varchar(20) NOT NULL,age smallint NOT NULL,sex smallint NOT NULL,qq varchar(20) NOT NULL,phone varchar(20) NOT NULL,c_time datetime(6<span style="color: #000000;">) NOT NULL);
    COMMIT;

    <span style="color: #008000;">#<span style="color: #008000;">创建的表名是:appname_模型name.lower(小写)

    <ol start="3" data-source-line="165">

  • 运行migrate命令,使迁移生效
  • (django) pyvip@Vip:~/code/<span style="color: #000000;">crm$ python manage.py migrate teacher
    Operations to perform:
    Apply all migrations: teacher
    Running migrations:
    Applying teacher.0001_initial... OK

    <span style="color: #008000;">#<span style="color: #008000;">执行了teacher.0001_initial这个里面的tables。

    <p data-source-line="178">我们查看下是否创建了


    <div class="cnblogs_code">

    >>>mysql>+-------------------+
    | Tables_in_crm     |
    +-------------------+
    | django_migrations |
    | teacher_students  |
    +-------------------+
    2 rows  set (0.00这里生成了两张表:
    第一张表用来记录django的migrations
    第二张表是我们需要的数据表

    <p data-source-line="193">查看表结构:


    <div class="cnblogs_code">

    >>>mysql>+--------+-------------+------+-----+---------+----------------+
    | Field  | Type        | Null | Key | Default | Extra          |
    +--------+-------------+------+-----+---------+----------------+
    | id     | int(11)     | NO   | PRI | NULL    | auto_increment |
    | name   | varchar(20) | NO   |     | NULL    |                |
    | age    | smallint(6) | NO   |     | NULL    |                |
    | sex    | smallint(6) | NO   |     | NULL    |                |
    | qq     | varchar(20) | NO   |     | NULL    |                |
    | phone  | varchar(20) | NO   |     | NULL    |                |
    | c_time | datetime(6) | NO   |     | NULL    |                |
    +--------+-------------+------+-----+---------+----------------+
    7 rows  set (0.00<span style="color: #008000;">#<span style="color: #008000;">此处表可以看到会根据我们的定义的模型来创建。

    <h1 id="mysql数据库的增删改查" data-source-line="216">MySQL数据库的增删改查
    <h4 id="django-shell调试工具" data-source-line="218">django shell调试工具
    <p data-source-line="219">在进入之前建议安装ipython(pip安装),使用会更方便


    <pre data-source-line="220"><code class="hljs"><span class="zh-hans">进入到调试工具

    <div class="cnblogs_code">

    >>>python manage.py shell

    <h3 id="增加" data-source-line="225">增加
    <pre data-source-line="226"><code class="hljs"><span class="hljs-meta">#<span class="bash"><span class="zh-hans">导入模型
    <div class="cnblogs_code">

    
    >>> teacher.models  Students 

    <p data-source-line="230">查询模型中是否有数据


    <div class="cnblogs_code">

    >>><span style="color: #000000;">Students.objects
    <django.db.models.manager.Manager at 0xb2e0fe0c>

    <p data-source-line="238">查询模型中的所有的值


    <div class="cnblogs_code">

    >>>
    

    <span style="color: #008000;">#<span style="color: #008000;">此时我们还未添加数据,所以此处为空

    
    
    >>>s1 = Students(name=,age=18,qq=需要保存才可以操作数据库
    >>>s1.save()

    <p data-source-line="255">是否创建成功了呢,我们在MySQL中查看一下


    <div class="cnblogs_code">

    mysql> select * +----+--------+-----+-----+--------+-------+----------------------------+
    | id | name   | age | sex | qq     | phone | c_time                     |
    +----+--------+-----+-----+--------+-------+----------------------------+
    |  1 | 小明   |  18 |   1 | 123456 |       | 2019-02-26 08:04:57.955584 |
    +----+--------+-----+-----+--------+-------+----------------------------+
    1 row  set (0.00<span style="color: #008000;">#<span style="color: #008000;">这里创建的时间一定是UTC时间,因为项目会运行在不同的时区,取出来的时候再转换成当前时间就好了。

    % (self.name,self.age)

    >>>]>
    >>>s2 =>>>s2.name = <span style="color: #800000;">'<span style="color: #800000;">小明<span style="color: #800000;">'

    s2.age = 18

    s2.qq = <span style="color: #800000;">'<span style="color: #800000;">123456<span style="color: #800000;">'

    >>>Students.objects.create(name=,qq=

    <span style="color: #008000;">#<span style="color: #008000;">返回查询集

    <h5 id="第四种方式先查查了再创建" data-source-line="294">第四种方式,先查,查了再创建


    <div class="cnblogs_code">

    >>>Students.objects.get_or_create(name=<span style="color: #008000;">#<span style="color: #008000;">没有创建成功,数据存在返回查到的值
    第一个元素代表模型对象,bool值代表是否创建,False代表没有创建是查询的。

    <h3 id="查询" data-source-line="306">查询
    <h5 id="all方法" data-source-line="308">all方法
    <p data-source-line="309">返回的是一个查询集,不是对象,没有操作数据库,可以查看到SQL语句


    <div class="cnblogs_code">

    >>>,,,]>
    

    <span style="color: #008000;">#<span style="color: #008000;">我们添加一些数据后,用于查询出来的结果

    <p data-source-line="314">查看all语句的背后的操作,查看sql语句


    <div class="cnblogs_code">

    >>>res =>>><span style="color: #0000ff;">print<span style="color: #000000;">(res.query)
    SELECT teacher_students.id,teacher_students.name,teacher_students.age,teacher_students.sex,teacher_students.qq,teacher_students.phone,teacher_students.c_time FROM teacher_students

    <span style="color: #008000;">#<span style="color: #008000;">就相当于SQL语句: SELECT * FROM 'teacher_students'

    <p data-source-line="323">切片方式


    <div class="cnblogs_code">

    >>>res =>>><span style="color: #0000ff;">print(res[1:2<span style="color: #000000;">].query)
    SELECT teacher_students.id,teacher_students.c_time FROM teacher_students LIMIT 1 OFFSET 1

    <span style="color: #008000;">#<span style="color: #008000;">通过切片的方式达到LIMIT的SQL语句

    <h5 id="get方法" data-source-line="333">get方法
    <p data-source-line="334">当我们的get匹配到多条数据的时候会报错。


    <div class="cnblogs_code">

    >>>Students.objects.get(name=
    

    <span style="color: #008000;">#<span style="color: #008000;">如果给定的查询内容,可以匹配到多条数据,则会报错,get方法只能获取单挑且唯一的数据

    <p data-source-line="339">pk:参数中pk代表主键


    <div class="cnblogs_code">

    >>>Students.objects.get(pk=1]>
    

    <span style="color: #008000;">#<span style="color: #008000;">同样可以查询到,pk代表主键

    <h5 id="filter方法" data-source-line="347">filter方法
    <div class="cnblogs_code">

    >>>res = Students.objects.filter(sex=1>>><span style="color: #0000ff;">print<span style="color: #000000;">(res.query)
    SELECT teacher_students.id,teacher_students.c_time FROM teacher_students WHERE teacher_students.sex = 1

    <h3 id="修改" data-source-line="359">修改
    <h5 id="get方法-2" data-source-line="361">get方法
    <p data-source-line="362">通过对象赋值的方法修改


    <div class="cnblogs_code">

    >>>s = Students.objects.get(name=>>>s.age = 16

    s.save()

    >>>Students.objects.filter(name=).update(age=191

    <h3 id="删除" data-source-line="378">删除


    <h5 id="delete" data-source-line="379">delete方法
    <p data-source-line="380">指定删除,通过对象查到数据,再删除对象


    <div class="cnblogs_code">

    >>>s = Students.objects.get(pk=2>>><span style="color: #000000;">s.delete()
    (1,(<span style="color: #800000;">'<span style="color: #800000;">teacher.Students<span style="color: #800000;">': 1<span style="color: #000000;">))

    <span style="color: #008000;">#<span style="color: #008000;">返回的是一个元祖:删除的数量,表的名称,删除数量

    >>>Students.objects.filter(sex=13,(: 3))

    <h1 id="数据库应用到模型中" data-source-line="399">数据库应用到模型中
    <p data-source-line="400">views中的配置


    <div class="cnblogs_code">

      teacher.models  
          students = Students.objects.all()

    <p data-source-line="407">对应的html中配置


    <ol data-source-line="408">

  • 获取值的方式和字典的方式一样,不用再另外配置
  • 下一篇内容:模型属性,及数据库进阶查询,

    相关文章

    注:所有源代码均实测运行过。所有源代码均已上传CSDN,请有...
    继承APIView和ViewSetMixin;作用也与APIView基本类似,提供...
    一、Django介绍Python下有许多款不同的 Web 框架。Django是重...
    本文从nginx快速掌握到使用,gunicorn快速掌握到使用,实现小...
    uniapp微信小程序订阅消息发送服务通知
    Django终端打印SQL语句 1 Setting配置: 2 默认python 使用的...