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  获取当前请求方式
  • 相关阅读:
    洛谷 P1236 算24点
    洛谷 P1483 序列变换
    洛谷 P2071 座位安排 seat.cpp/c/pas
    洛谷 P3079 [USACO13MAR]农场的画Farm Painting
    洛谷 P3912 素数个数
    洛谷 P1617 爱与愁的一千个伤心的理由
    洛谷 P1894 [USACO4.2]完美的牛栏The Perfect Stall
    hdu_5908_Abelian Period(暴力)
    hdu_4283_You Are the One(区间DP)
    hdu_5903_Square Distance(dp)
  • 原文地址:https://www.cnblogs.com/yangmeichong/p/11315464.html
Copyright © 2011-2022 走看看