• ADADADADAD

    django+mysql如何使用[ mysql数据库 ]

    mysql数据库 时间:2024-11-26 22:15:26

    作者:文/会员上传

    简介:

    Django中每一个模型model都对应于数据库中的一张表,每个模型中的字段都对应于数据库表的列。方便的是,django可以自动生成这些create table, alter table, drop table的操作。

    以下为本文的正文内容,内容仅供参考!本站为公益性网站,复制本文以及下载DOC文档全部免费。

    Django中每一个模型model都对应于数据库中的一张表,每个模型中的字段都对应于数据库表的列。方便的是,django可以自动生成这些create table, alter table, drop table的操作。其次Django为咱们也提供了后台管理模块(Django-Admin),主要功能是通过后台管理来实现客户端的功能,可以对数据进行增删改查。也可以通过该功能进行二次开发
    Django中的mysql配置

    在上期内容,我们了解了settings.py配置信息的内容,其中DATABASES是用来管理数据库配置的,默认是sqlite3数据库,所以我们需要将其修改成mysql数据库。

    #Database
    #https://docs.djangoproject.com/en/2.0/ref/settings/#databases

    #数据库配置默认的数据库为sqlite
    #DATABASES={
    #'default':{
    #'ENGINE':'django.db.backends.sqlite3',
    #'NAME':os.path.join(BASE_DIR,'db.sqlite3'),
    #}
    #}
    DATABASES={
    'default':{
    'ENGINE':'django.db.backends.mysql',#数据库引擎
    'NAME':'django_mysql',#数据库名
    'USER':'root',#账号
    'PASSWORD':'root',#密码
    'HOST':'127.0.0.1',#HOST
    'POST':3306,#端口

    }
    }

    字段名称代码中都添加了相应说明,ENGINE为MYSQL数据库引擎,这个当然不会凭空出现,需要我们去安装

    安装pymysql

    pip3installpymysql

    项目中配置

    在最开始的项目包下的__init__.py中进行如下配置

    """
    setting中的配置默认为sqlite3数据库当需要修改成MySql时
    并且在setting.py的同级目录的__init__.py加入如下配置
    否则会报错:ErrorloadingMySQLdbmodule.
    """
    importpymysql
    pymysql.install_as_MySQLdb()

    如果mysql配置信息错误(用户名、密码、host等)控制台会报如下异常

    pymysql.err.OperationalError:(1045,"Accessdeniedforuser'ROOT'@'localhost'(usingpassword:YES)")

    在app文件的models.py文件中 创建Student(学生信息)和StudentUnion(社团信息)

    models.py:数据模块,用于数据库设计

    """
    创建学生信息表模型
    """
    fromdjango.dbimportmodels

    """
    该类是用来生成数据库的必须要继承models.Model
    """
    classStudent(models.Model):
    """
    创建如下几个表的字段
    """
    #学号primary_key=True:该字段为主键
    studentNum=models.CharField('学号',primary_key=True,max_length=15)
    #姓名字符串最大长度20
    name=models.CharField('姓名',max_length=20)
    #年龄整数null=False,表示该字段不能为空
    age=models.IntegerField('年龄',null=False)
    #性别布尔类型默认True:男生False:女生
    sex=models.BooleanField('性别',default=True)
    #手机unique=True该字段唯一
    mobile=models.CharField('手机',unique=True,max_length=15)
    #创建时间auto_now_add:只有在新增的时候才会生效
    createTime=models.DateTimeField(auto_now_add=True)
    #修改时间auto_now:添加和修改都会改变时间
    modifyTime=models.DateTimeField(auto_now=True)

    #指定表名不指定默认APP名字——类名(app_demo_Student)
    classMeta:
    db_table='student'


    """
    学生社团信息表
    """
    classstudentUnion(models.Model):
    #自增主键,这里不能设置default属性,负责执行save的时候就不会新增而是修改元素
    id=models.IntegerField(primary_key=True)
    #社团名称
    unionName=models.CharField('社团名称',max_length=20)
    #社团人数
    unionNum=models.IntegerField('人数',default=0)
    #社团负责人关联Student的主键即studentNum学号一对一的关系,on__delete属性在django2.0之后为必填属性后面会介绍
    unionRoot=models.OneToOneField(Student,on_delete=None)

    classMeta:
    db_table='student_union'


    """
    OneToOneField:一对一
    ForeignKey:一对多
    ManyToManyField:多对多(没有ondelete属性)
    """

    在利用models.py文件生成数据库表之前,我们需要手动的先创建数据库:

    mysql>createdatabasedjango_mysql;
    QueryOK,1rowaffected(0.01sec)

    创建完django_msql库之后,我们在终端执行如下命令,他的作用是将models文件生成一个迁移文件

    python3manage.pymakemigrations

    迁移文件生成完毕,执行

    python3manage.pymigrate

    会将迁移文件的内容作用到数据库中,生成表或者修改字段属性

    控制台输出如下,则表示执行成功

    (django_venv)xxxxxdeAir:djangoDemoxxxxx$python3manage.pymigrate
    Operationstoperform:
    Applyallmigrations:admin,app_demo,auth,contenttypes,sessions
    Runningmigrations:
    Applyingcontenttypes.0001_initial...OK
    Applyingauth.0001_initial...OK
    Applyingadmin.0001_initial...OK
    Applyingadmin.0002_logentry_remove_auto_add...OK
    Applyingadmin.0003_logentry_add_action_flag_choices...OK
    Applyingapp_demo.0001_initial...OK
    Applyingcontenttypes.0002_remove_content_type_name...OK
    Applyingauth.0002_alter_permission_name_max_length...OK
    Applyingauth.0003_alter_user_email_max_length...OK
    Applyingauth.0004_alter_user_username_opts...OK
    Applyingauth.0005_alter_user_last_login_null...OK
    Applyingauth.0006_require_contenttypes_0002...OK
    Applyingauth.0007_alter_validators_add_error_messages...OK
    Applyingauth.0008_alter_user_username_max_length...OK
    Applyingauth.0009_alter_user_last_name_max_length...OK
    Applyingsessions.0001_initial...OK

    查看我们的django_mysql数据库,其中student和student_union就是用models文件生成的表,其他的表是项目自动生成的,暂时可以先不用管

    mysql>usedjango_mysql
    Databasechanged

    mysql>showtables;
    +----------------------------+
    |Tables_in_django_mysql|
    +----------------------------+
    |auth_group|
    |auth_group_permissions|
    |auth_permission|
    |auth_user|
    |auth_user_groups|
    |auth_user_user_permissions|
    |django_admin_log|
    |django_content_type|
    |django_migrations|
    |django_session|
    |student|
    |student_union|
    +----------------------------+
    12rowsinset(0.00sec)

    表结构

    desc查看表结构

    mysql>descstudent;
    +------------+-------------+------+-----+---------+-------+
    |Field|Type|Null|Key|Default|Extra|
    +------------+-------------+------+-----+---------+-------+
    |studentNum|varchar(15)|NO|PRI|NULL||
    |name|varchar(20)|NO||NULL||
    |age|int(11)|NO||NULL||
    |sex|tinyint(1)|NO||NULL||
    |mobile|varchar(15)|NO|UNI|NULL||
    |createTime|datetime(6)|NO||NULL||
    |modifyTime|datetime(6)|NO||NULL||
    +------------+-------------+------+-----+---------+-------+
    7rowsinset(0.00sec)
    mysql>descstudent_union;
    +--------------+-------------+------+-----+---------+-------+
    |Field|Type|Null|Key|Default|Extra|
    +--------------+-------------+------+-----+---------+-------+
    |id|int(11)|NO|PRI|NULL||
    |unionName|varchar(20)|NO||NULL||
    |unionNum|int(11)|NO||NULL||
    |unionRoot_id|varchar(15)|NO|UNI|NULL||
    +--------------+-------------+------+-----+---------+-------+
    4rowsinset(0.00sec)

    至此Django利用models文件创建数据库表的功能已经完毕。接下来用代码的方式演示一下Django如何进行增删改查

    增加数据

    为了提供一些测试数据,这里用for循环批量的加了几条简单的数据。

    fromapp_demo.modelsimportStudent
    importrandom
    """
    插入测试数据
    """
    definsert(request):
    #随机整数作为学号
    foriinrange(0,5):
    studentNum=int(random.uniform(0,1)*10000000000)
    #从models文件中获取student对象
    student=Student()
    #给对象赋值
    student.studentNum=studentNum
    student.name='tom'+str(i)
    student.age=15
    student.sex=random.choice([True,False])
    student.mobile=int(random.uniform(0,1)*10000000000)
    #插入数据
    student.save()

    returnHttpResponse('数据插入完毕')

    urls.py 文件中 urlpatterns中配置

    url(r'^insert/',views.insert)

    浏览器中访问http://localhost:8000/insert/ 浏览器显示‘数据插入完毕’

    查询数据库,发现有5天数据,也就是插入成功

    mysql>select*fromstudent;
    +------------+------+-----+-----+------------+----------------------------+----------------------------+
    |studentNum|name|age|sex|mobile|createTime|modifyTime|
    +------------+------+-----+-----+------------+----------------------------+----------------------------+
    |1352687635|tom2|15|1|941807449|2018-11-0809:58:40.226856|2018-11-0809:58:40.227002|
    |5554311867|tom0|15|0|1598619027|2018-11-0809:58:40.203807|2018-11-0809:58:40.203960|
    |7302510986|tom4|15|0|9602601619|2018-11-0809:58:40.251479|2018-11-0809:58:40.251682|
    |847849420|tom3|15|0|195276039|2018-11-0809:58:40.238601|2018-11-0809:58:40.238928|
    |9962892430|tom1|15|0|3265013828|2018-11-0809:58:40.215488|2018-11-0809:58:40.216106|
    +------------+------+-----+-----+------------+----------------------------+----------------------------+
    5rowsinset(0.00sec)

    查询数据

    """
    查询
    """
    deffind(request):
    #sql='select*fromstudent'
    #django也可以执行原生的sql语句
    #result=Student.objects.raw(sql)

    #查询name=tom1的数据
    result=Student.objects.filter(name='tom1')
    """
    result为<class'django.db.models.query.QuerySet'>的对象
    需要进行数据处理
    """
    arr=[]
    foriinresult:
    content={'学号':i.studentNum,'姓名':i.name,'性别':i.sex}
    arr.append(content)
    print(arr)
    print(type(arr))
    returnHttpResponse(arr)

    配置urls,浏览器访问localhost:8000/find/

    修改数据

    """
    修改
    """
    defmodify(request,studentNum):
    #通过学号获取student对象
    student=Student.objects.get(studentNum=studentNum)
    #设置student的name为jack
    student.name='jack'
    student.save()
    returnHttpResponse('修改成功.')

    setting文件中的配置如下

    url(r'^modify/(?P<studentNum>\d+)',views.modify),

    修改学号847849420的name为jack

    再次查询mysql数据库,发现name已经被更新成了jack

    mysql>select*fromstudentwherestudentNum='847849420';
    +------------+------+-----+-----+-----------+----------------------------+----------------------------+
    |studentNum|name|age|sex|mobile|createTime|modifyTime|
    +------------+------+-----+-----+-----------+----------------------------+----------------------------+
    |847849420|jack|15|0|195276039|2018-11-0809:58:40.238601|2018-11-0810:22:46.403147|
    +------------+------+-----+-----+-----------+----------------------------+----------------------------+
    1rowinset(0.00sec)

    删除数据

    """
    删除
    """
    defdelete(request,studentNum):
    student=Student.objects.get(studentNum=studentNum)
    student.delete()
    returnHttpResponse('删除成功.')

    settings.py中urlpatterns的配置如下

    url(r'^delete/(?P<studentNum>.+)',views.delete)

    .+ 表示匹配多个字符(不包括换行等字符)

    浏览器请求该视图

    查询数据库,发现该数据已经被删除

    mysql>select*fromstudentwherestudentNum='847849420';
    Emptyset(0.01sec
    django+mysql如何使用.docx

    将本文的Word文档下载到电脑

    推荐度:

    下载
    热门标签: djangomysql