Django2.2框架:ORM数据库操作

Django框架:ORM数据库操作

1、ORM介绍

映射关系:

  表名 --------------------》类名

  字段--------------------》属性

  表记录-----------------》类实例化对象

ORM的两大功能:

  操作表:

    - 创建表

    - 修改表

    - 删除表

  操作数据行:

    - 增删改查

ORM利用pymysql第三方工具链接数据库

Django没办法帮我们创建数据库,只能我们创建完之后告诉它,让django去链接

2、创建表之前的准备工作

一、自己创建数据库

二、在settings里面配置mysql数据库链接

  sqlite3------改为mysql

修改django默认的数据库的sqlite3为mysql

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', #通过这个去链接mysql
'NAME': 'djangotsgl',
'USER':'root',
'PASSWORD':'123456',
'HOST':'localhost',
'PORT':'3306',
}
}

STATIC_URL = '/static/'
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static/'),
)
  这样写上以后django会默认的就去链接数据库

3、工程目录中的--init--文件

import pymysql
pymysql.install_as_MySQLdb()

4、创建数据库表

models.py

class Book(models.Model): #必须要继承的
nid = models.AutoField(primary_key=True) #自增id(可以不写,默认会有自增id)
title = models.CharField(max_length=32)
publishDdata = models.DateField() #出版日期
author = models.CharField(max_length=32)
price = models.DecimalField(max_digits=5,decimal_places=2) #一共5位,保留两位小数

执行命令创建:(需要记住的!!!) 

python3 manage.py makemigrations 创建脚本
python3 manage.py migrate 迁移
具体例子实现

model.py
Alt text

urls.py
Alt text

views.py

from polls.models import Book
def data_oper(request):
obj=Book(
title="周测试",
price=199,
publishDdata="2019-05-26",
author="stone",
)
obj.save()

return HttpResponse("Hello world")

template /index.html







Title




















{% for book in book_list %}








{% endfor %}

编号 书名 出版日期 作者 价钱 操作
{{ book.nid }} {{ book.title }} {{ book.publishDdata|date:'Y-m-d' }} {{ book.author }} {{ book.price }}








图片内容具体,
Alt text

5、查看数据库的sql语句(加在settings.py)

查看数据库执行代码
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level':'DEBUG',
},
}
}

6、遇到的问题

6.1、Django - installing mysqlclient error: mysqlclient 1.3.13 or newer is required; you have 0.9.3

解决方法:

cd 项目路径下:venv/lib/python3.7/site-packages/django/db/backends/mysql
vim base.py

if version < (1, 3, 13):
pass
"""
raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.version)

"""

6.2、Django2.2报错——AttributeError: ''str'' object has no attribute ''decode''

Django2.2报错–AttributeError: ‘str’ object has no attribute 'decode’的解决方案,仅算是临时解决,所有更好的解决方案应该斟酌使用本方法

解决方法:

文件位置:项目路径:venv/lib/python3.7/site-packages/django/db/backends/mysql
文件名:operations.py
修改方法:注释145 146 代码

query = getattr(cursor, '_executed', None)
# if query is not None:
# query = query.decode(errors='replace')
return query

6.3 Django2.2 MySQL Strict Mode is not set for database connection 'default'

解决方法:

修改文件:settings.py
修改内容:

DATABASES = {
# 'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
# }
'default': {
'ENGINE': 'django.db.backends.mysql', # 通过这个去链接mysql
'NAME': 'test_db',
'USER': 'test',
'PASSWORD': 'passwd',
'HOST': 'localhost',
'PORT': '3306',
'OPTIONS': {
"init_command": "SET sql_mode='STRICT_TRANS_TABLES'"
},
}
}

6.4、执行python manage.py makemigrations和python manage.py migrate表没有创建,原因之一:

项目路径setting文件,未添加新建项目名:

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'polls',
]

posted @ 2019-07-11 18:04  石Stone头  阅读(585)  评论(0)    收藏  举报