• 被解放的姜戈02 庄园疑云


    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!

    上一回说到,姜戈的江湖初体验:如何架设服务器,如何回复http请求,如何创建App。这一回,我们要走入糖果庄园。

    数据库是一所大庄园,藏着各种宝贝。一个没有数据库的网站,所能提供的功能会非常有限。

    为了找到心爱的人,姜戈决定一探这神秘的糖果庄园。

    连接数据库

    ps: 博主的环境用的都是时下最新的 ,mysql,python 相比原博主版本有较大变化 

         python 3.x 取消了mysqldb 改为 pymysql 在scc.init下加上:  

       import pymysql

    pymysql.install_as_MySQLdb()

    Django为多种数据库后台提供了统一的调用API。根据需求不同,Django可以选择不同的数据库后台。MySQL算是最常用的数据库。我们这里将Django和MySQL连接。

    先查看Mysql服务是否启动(博主 windows 安装完Mysql 后自动启动的 可以打开cmd 输入 servics.msc 回车 找到Mysql(名字在安装时可以自己取)  启动)

    在Linux终端下启动mysql: (W系类的$拿掉)

    $mysql -u root -p

    root 为Mysql安装时创建的账号 密码为安装时设的密码 

    在MySQL中创立Django项目的数据库:(villa 为数据库名)

    mysql> CREATE DATABASE villa DEFAULT CHARSET=utf8;

    这里使用utf8作为默认字符集,以便支持中文。

    在MySQL中为Django项目创立用户,并授予所有(原文相关权限,博主环境下有错误:提示权限不够账号被拒绝 所以改为了所有)权限:(username ,password自行设定)

    mysql> create user 'username'@'%' identified by 'password';
    mysql> GRANT ALL ON villa.* TO 'username'@'localhost';

    在settings.py中,将DATABASES对象更改为:

    复制代码
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'villa',
            'USER': 'username(你自己的)',
            'PASSWORD': 'password(你自己的)',
            'HOST':'localhost',
            'PORT':'3306',
        }
    }
    复制代码

    后台类型为mysql。上面包含数据库名称和用户的信息,它们与MySQL中对应数据库和用户的设置相同。Django根据这一设置,与MySQL中相应的数据库和用户连接起来。此后,Django就可以在数据库中读写了。

    姜戈略一迟疑,旋即走入了庄园的大门。

    创立模型

    MySQL是关系型数据库。但在Django的帮助下,我们不用直接编写SQL语句。Django将关系型的表(table)转换成为一个类(class)。而每个记录(record)是该类下的一个对象(object)。我们可以使用基于对象的方法,来操纵关系型的MySQL数据库。

    在传统的MySQL中,数据模型是表。在Django下,一个表为一个类。表的每一列是该类的一个属性。在models.py中,我们创建一个只有一列的表,即只有一个属性的类:

    from django.db import models
    
    class Character(models.Model):
        name = models.CharField(max_length=200)
        def __str__(self):
            return self.name

    类Character定义了数据模型,它需要继承自models.Model。在MySQL中,这个类实际上是一个表。表只有一列,为name。可以看到,name属性是字符类型,最大长度为200。

    类Character有一个__str__()方法,用来说明对象的字符表达方式。

    命令Django同步数据库。Django根据models.py中描述的数据模型,在MySQL中真正的创建各个关系表:

    python E:pythonProjectScc_Djangomanage.py makemigrations             

    python E:pythonProjectScc_Djangomanage.py migrate

    同步数据库后,Django将建立相关的MySQL表格,并要求你创建一个超级用户:

    Creating tables ...
    Creating table django_admin_log
    Creating table auth_permission
    Creating table auth_group_permissions
    Creating table auth_group
    Creating table auth_user_groups
    Creating table auth_user_user_permissions
    Creating table auth_user
    Creating table django_content_type
    Creating table django_session
    Creating table west_character

    You just installed Django's auth system, which means you don't have any superusers defined.
    Would you like to create one now? (yes/no): yes
    Username (leave blank to use 'tommy'): vamei
    Email address: vamei@vamei.com
    Password: 
    Password (again): 
    Superuser created successfully.
    Installing custom SQL ...
    Installing indexes ...
    Installed 0 object(s) from 0 fixture(s)

     ps: 没有问是否建立超级用户 cmd 下 输入 

    python E:pythonProjectScc_Djangomanage.py createsuperuser  

    然后按要求就好了 该超级用户用来登入 admin页面

     数据模型建立了。打开MySQL命令行:(最后说一遍 windows 别打$,username 是你自己建的账号 )

    $mysql -u username -p 

    查看数据模型:

    USE villa;
    SHOW TABLES;
    SHOW COLUMNS FROM scc_character;

    最后一个命令返回Character类的对应表格:

    +-------+--------------+------+-----+---------+----------------+
    | Field | Type         | Null | Key | Default | Extra          |
    +-------+--------------+------+-----+---------+----------------+
    | id    | int(11)      | NO   | PRI | NULL    | auto_increment |
    | name  | varchar(200) | NO   |     | NULL    |                |
    +-------+--------------+------+-----+---------+----------------+
    2 rows in set (0.00 sec)

     可以看到,Django还自动增加了一个id列,作为记录的主键(Primary Key)。

    这富丽堂皇的别墅中,姜戈隐隐闻到凶险的味道。

    显示数据

    数据模型虽然建立了,但还没有数据输入。为了简便,我们手动添加记录。打开MySQL命令行,并切换到相应数据库。添加记录:

    INSERT INTO scc_character (name) Values ('Vamei');
    INSERT INTO scc_character (name) Values ('Django');
    INSERT INTO scc_character (name) Values ('John');

    查看记录:

     SELECT * FROM west_character;

    可以看到,三个名字已经录入数据库。

    下面我们从数据库中取出数据,并返回给http请求。在scc/views.py中,添加视图。对于对应的请求,我们将从数据库中读取所有的记录,然后返回给客户端:

    复制代码
    # -*- coding: utf-8 -*-
    
    from django.http import HttpResponse
    
    from scc.models import Character
    
    def staff(request):
        staff_list = Character.objects.all()
        staff_str  = map(str, staff_list)
        return HttpResponse("<p>" + ' '.join(staff_str) + "</p>")
    复制代码

    可以看到,我们从west.models中引入了Character类。通过操作该类,我们可以读取表格中的记录

    为了让http请求能找到上面的程序,在scc/second_url.py增加url导航:

    from django.conf.urls import url,include
    from django.contrib import admin
    from scc import views

    urlpatterns = [
    url(r'^$',views.first_page_1),
    url(r'^staff/',views.staff)
    ]

    运行服务器。在浏览器中输入URL:

    127.0.0.1:8000/scc/staff

    查看效果:

    从数据库读出数据,显示在页面

    “我心爱的人,原来你在这里。” 姜戈强自镇定,嘴角忍不住颤动。

    总结

    Django使用类和对象接口,来操纵底层的数据库。

    有了数据库,就有了站点内容的大本营。

    姜戈,风雨欲来。

    欢迎阅读“被解放的姜戈”系列文章。

  • 相关阅读:
    APP测试的那些坑
    最全的测试工具以及测试需要掌握的工具
    接口测试的必要性
    jmeter-察看结果树-响应数据,中文显示乱码问题处理
    JMeter学习(一)工具简单介绍
    BZOJ1972: [Sdoi2010]猪国杀
    luoguP1311 选择客栈 题解(NOIP2011)
    luoguP1003 铺地毯 题解(NOIP2011)
    luoguP1081 开车旅行 题解(NOIP2012)
    luoguP3391[模板]文艺平衡树(Splay) 题解
  • 原文地址:https://www.cnblogs.com/BestZed/p/5458351.html
Copyright © 2020-2023  润新知