zoukankan      html  css  js  c++  java
  • Django操作Mysql

    一、django链接mysql

      db.sqlite3是django自带的一个小数据库,支持的功能不是很多,对日期格式也不是很敏感

      如果想改成mysql就需要将settings.py中DATABASES这段进行修改

    # 第一步修改
    #
    默认 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } } # 修改为mysql DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', } 'NAME': 'test', 'USER':'root', 'PASSWORD':'123', 'HOST':'127.0.0.1', 'PORT':3306, 'CHARSET':'utf8' }

    # 第二步修改
      去应用名下的__init__.py或者项目名下的__init__.py文件中 告诉django不要使用默认的mysqld_db模块连接mysql而是使用pymysql

    import pymysql
    pymysql.install_as_MySQLdb()

    二、Django ORM简介 

    # 对象关系映射
    类        >>>                数据库的表
    对象     >>>                数据库里面的一条条的表记录
    对象点属性      >>>                表记录的某个字段对应的值
        
    ps:
    优点:能够让一个不会数据库操作的人 也能够通过编程语言轻松的操作数据库
    缺点:有时候sql语句的查询效率可能偏低

    注意事项

    1.orm 建表

    django orm 注意事项
        django orm不会帮你自动创建库 只能帮你自动创建表
        1.models.py中写模型类
    class User(models.Model):
    # id int primary_key # django orm在你没有指定逐渐字段的时候,会自动帮你建一个id为主键的字段,如果名字要叫其它的需要自建
    # uid = models.AutoField(primary_key=True)
    # username varchar(32)
    username = models.CharField(max_length=32)
    password = models.CharField(max_length=32)
    2.执行数据库迁移(同步)命令 
      python3 manage.py makemigrations 将数据的更改操作记录到小本本上,以便查询操作记录
      python3 manage.py migrate 将更改真正同步到数据库

    执行后可以看到:migrations目录中会有一个001_initial.py文件记录你的操作
    执行第二条命令后可以看到:数据库创建了很多的表,而我们要用到的表名变成了:应用名.user 例:app01.user
      并且那些多出来的表不能删除

    2.orm 查询数据库

    # login.html页面
    # 前端登录页面body内容
    <div class="container">
        <h2>登录页面</h2>
        <div class="row">
            <div class="col-md-8  col-md-offset-2">
                <form action="" method="post">
                    <p>username:<input type="text" class="form-control" name="username"></p>
                    <p>password:<input type="password" class="form-control" name="password"></p>
                    <input type="submit" class="btn btn-success pull-right">
                </form>
            </div>
        </div>
    </div>
    
    # views.py操作
    def login(request):
        print(request.method) # 获取当前请求方式
        if request.method == 'POST':
            # 获取post请求提交的数据
            print(request.POST)
            username = request.POST.get('username')  # <QueryDict: {'username': ['simon'], 'password': ['123']}>
            password = request.POST.get('password')
            # user_obj = models.User.objects.filter(username=username)[0]  # select id,username,password from user where username='jason'  # 不推荐索引取值,索引只能用正向索引,不支持负数索引
         user_obj = models.User.objects.filter(username=username).first() # 推荐使用first获取对象
         # user_obj = models.User.objects.filter(username=username) # user_obj.query可以查询到具体运行的sql语句;只有queryset对象才可以点query查看对应的语句
         # print(user_obj.query) # SELECT `app01_user`.`id`, `app01_user`.`username`, `app01_user`.`password` FROM `app01_user` WHERE `app01_user`.`username` = simon
         print(user_obj)
    print(user_obj.id)
            print(user_obj.pk) # pk会自动查找当前对象的主键字段
            print(user_obj.username)
            print(user_obj.password)
            """
            filter 方法:
           """
        return render(request,'login.html')
    
    
    POST
    <QueryDict: {'username': ['simon'], 'password': ['123']}>
    User object (1)
    1
    1
    simon
    123

    # views.py中login.py和前端页面输入的账号密码进行比对
    # views.py中login函数定义
    def login(request):
        if request.method == 'POST':
            username = request.POST.get('username')
            password = request.POST.get('password')
            is_alive = models.User.objects.filter(username=username,password=password)  # filter支持传多个参数,并且是and的关系
            # select id,username,password from user where username='simon' and password = '123'
            if is_alive:
                return HttpResponse("登录成功")
            return HttpResponse("登录失败")
    
    # 请求登录之后可以看到:账号密码正确,登录成功;不正确就失败

    3.表字段的增删改

    # user表新增字段addr,email
    # modles.py
    class User(models.Model):
        username = models.CharField(max_length=32)
        password = models.CharField(max_length=32)
        addr = models.CharField(max_length=32,default='null') # 只要修改了models.py中跟数据库相关的数据,必须重新执行数据库的2条同步命令; null=True该字段可以为空
        email = models.CharField(max_length=32,null=True)
    
    # 删除字段email
        只需要将刚增加的email这行注销掉,重新执行同步命令就可以了(正式服不建议,一定要小心)
    
    # 修改字段
    username = models.CharField(max_length=64)
    将之前有的哪行需要修改的地方修改一次后,执行同步命令

    4.表数据的增删改查

    # 数据新增
    # 注册页面
    # register.html前端页面
    # body内容
    <div class="container">
        <div class="row">
            <div class="col-md-6 col-md-offset-2">
                <h2 class="text-center">注册页面</h2>
                <form action="" method="post">
                    <p>username:<input type="text" class="form-control" name="username"></p>
                    <p>password:<input type="password" class="form-control" name="password"></p>
                    <p>addr<input type="text" class="form-control" name="addr"></p>
                    <input type="submit" class="btn btn-success pull-right">
                </form>
            </div>
        </div>
    </div>
    
    # urls.py新增一条
    path('register/', views.register),
    
    # views.py新增register函数

    def register(request):
      if request.method == "POST":
        username = request.POST.get('username')
        password = request.POST.get('password')
        addr = request.POST.get('addr')
        # orm创建数据
        # 第一种方式:推荐
        models.User.objects.create(username=username,password=password,addr=addr)
        # 第二种方式
        # user_obj = models.User() # 实例化产生对象
        # user_obj.username = username
        # user_obj.password = password
        # user_obj.addr = addr
        # user_obj.save() # 保存到数据库
        return redirect('/user_list')
      return render(request,'register.html')

    # 运行后进行注册,可以看到新增的数据

     5.数据查询

    # 数据查询
    # views.py
    def user_list(request):
        # 获取表所有的数据
        data = models.User.objects.all()  # select id,username,password,addr from user;
        # print(data) # <QuerySet [<User: User object (1)>, <User: User object (2)>, <User: User object (3)>]>
        # return render(request,'list.html',{'data':data})  # 第一种给页面传值的方式:写字典
        return render(request,'list.html',locals())   # 会将当前名称空间中的所有名字都传递给前端页面

    6.数据修改

    # 修改编辑
        基于已经存在了的数据进行修改
    # 思路
    先将用户想要修改的数据查询出来 并且展示给用户看
    用户修改完之后发送post请求,后端修改数据
    
    # urls.py新增一条
    path('edit/', views.edit),
    
    # views.py  增加edit函数
    def edit(request):
        if request.method == "POST":
            edit_id = request.GET.get('id')
            username = request.POST.get('username')
            password = request.POST.get('password')
            addr = request.POST.get('addr')
            # queryset对象,可以直接调用update方法进行批量更新;如果queryset对象中有多个数据对象,那么会将多个数据对象全部更新
            # 第一种更新方式:针对修改的字段进行更新
            models.User.objects.filter(pk=edit_id).update(username=username,password=password,addr=addr)
            # 第二种更新方式:不推荐,会将所有字段更新一遍,效率低
            # edit_obj = models.User.objects.filter(pk=edit_id).first()
            # edit_obj.username = username
            # edit_obj.password = password
            # edit_obj.addr = addr
            # edit_obj.save() # 数据保存
            return redirect('/user_list')
        # print(request.GET) # 获取GET请求携带的参数
        edit_id = request.GET.get('id')
        # 查询该主键对应的数据
        edit_obj = models.User.objects.filter(pk=edit_id).first()
    
    # 前端修改
    # body内容
    <div class="container">
        <div class="row">
            <div class="col-md-6 col-md-offset-2">
                <h2 class="text-center">编辑</h2>
                <form action="" method="post">
                    <p>username:<input type="text" class="form-control" name="username" value="{{ edit_obj.username }}"></p>
                    <p>password:<input type="password" class="form-control" name="password" value="{{ edit_obj.password }}"></p>
                    <p>addr<input type="text" class="form-control" name="addr" value="{{ edit_obj.addr }}"></p>
                    <input type="submit" class="btn btn-success pull-right" value="修改">
                </form>
            </div>
        </div>
    </div>

    7.数据删除

    # views.py
    def delete(request):
        delete_id = request.GET.get('id')
        models.User.objects.filter(pk=delete_id).delete()  # 批量删除
        return redirect('/user_list')

     8.总结:

    数据的增删改查
        增
            1.create()
                modeles.User.objects.create(kwargs)
                create方法会返回当前所创建的数据对象(*****),返回simon 
            2.对象.save()
                user_obj = models.User()
                user_obj.username = 'simon'
                user_obj.save() # 数据保存
        删
            queryset对象.delete()
        改
            1.update()
                models.User.objects.filter(kwargs).update()
                批量更新
            
            2.对象.save()
                user_obj = models.User(kwargs)
                user_obj.username = 'jason'
                user_obj.save()
                效率较低
        查
            1.all()  查所有 不需要传参数
            2.filter(kwargs)  结构是一个queryset对象 你可以把它看成一个列表里面是一个个的数据对象

     四、Django请求生命周期

    request.GET  获取get请求携带的参数
    request.POST  获取post请求携带的参数
    上面两者在用get取值的时候 默认取列表最后一个元素
    如果想整体取用getlist
    request.method  获取当前请求方式
  • 相关阅读:
    【LeetCode】Validate Binary Search Tree
    【LeetCode】Search in Rotated Sorted Array II(转)
    【LeetCode】Search in Rotated Sorted Array
    【LeetCode】Set Matrix Zeroes
    【LeetCode】Sqrt(x) (转载)
    【LeetCode】Integer to Roman
    贪心算法
    【LeetCode】Best Time to Buy and Sell Stock III
    【LeetCode】Best Time to Buy and Sell Stock II
    CentOS 6 上安装 pip、setuptools
  • 原文地址:https://www.cnblogs.com/yangmeichong/p/11315464.html
Copyright © 2011-2022 走看看