Django与数据库MySQL连接的用法

本文详细介绍了一个基于Django框架的应用开发过程,包括项目搭建、数据库设计、视图与模板的使用等核心内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自己动手写Django app的教学网址:https://my.oschina.net/davidxp/blog/109460

创建mysite目录

django-admin.py startproject mysite这个命令作用是:这将创建在当前目录创建一个mysite目录

前提是从命令行上cd到你想储存你代码的目录,然后生成各种子目录.

这里写图片描述

首先需要注意的是文件目录

文件目录

这里面的文件大致作用:

  • books这个 文件夹存放的是新建数据库的各种信息
  • books/templates这个目录下装的是网页的布局,当然这个网页的布局就是show.html所提供
  • books/views.py定义函数,并且把show.html引入进去,文件内容如下:
from django.shortcuts import render,render_to_response

from django.template import loader

from books import models

# Create your views here.

def show(request):
    # publisher_list = [{'name':"gongye",'city':'beijing'}]
    publisher_list = models.Publisher.objects.all()
    return render_to_response('show.html',{'publisher_list':publisher_list})
  • books/models.py文件存放的是你所创建的数据库,代码如下:
#coding=utf-8
from __future__ import unicode_literals

from django.db import models

# Create your models here.

class Publisher(models.Model):
    name = models.CharField(max_length = 30)
    address = models.CharField(max_length = 50)
    city = models.CharField(max_length = 60)
    state_province = models.CharField(max_length = 30)
    country = models.CharField(max_length = 50)
    website = models.URLField()
# __unicode__这个函数用来返回某个值可以很好的用于查询和admin界面的显示
    def __unicode__(self):
        return self.name

class Author(models.Model):
    first_name = models.CharField(max_length = 30)
    last_name = models.CharField(max_length = 40)
    email = models.EmailField(blank = True,verbose_name = 'e-mail')
    def __unicode__(self):
        return u'%s %s'%(self.first_name,self.last_name)

class Book(models.Model):
    title = models.CharField(max_length = 100)
    author = models.ManyToManyField(Author)
    publisher = models.ForeignKey(Publisher)
    publication_date = models.DateField(blank = True,null = True)
    def __unicode__(self):
        return self.title
  • books下其他的文件就是在创建的过程中自己产生的.

  • website/templates文件里存放的是各种显示的静态网页布局,这么多html文件,只要你在访问测试的时候,端口号后面加上html的文件名字就行.比如,我要访问templates/base.html文件,输入网址:localhost:8000/base就可以.

  • website/settings.py文件是Django的设置文档,里面的INSTALLED_APPS添加多个应用,比如这里面我九添加了books应用,代码如下:

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

增加模板文件夹,能够引入templates,代码如下:(同样都是在settings中修改)

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': ['templates'],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
  • website/urls.py作用是引导url(资源管理器),代码如下:
#coding=utf-8
"""website URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/1.9/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  url(r'^$', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  url(r'^$', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.conf.urls import url, include
    2. Add a URL to urlpatterns:  url(r'^blog/', include('blog.urls'))
"""
from django.conf.urls import *
from django.contrib import admin
from website.views import *

urlpatterns = patterns('website.views',
    url(r'^admin/', admin.site.urls),
    (r'^$','my_homepage_view'),
    (r'^hello/$','hello'),
    (r'^time/$','current_datetime'),#显示当前时间
    (r'^time/plus/(\d{1,2})/$','hour_ahead'),#显示几小时后的时间
    (r'xiaomi/$','xiaomi'),
    (r'name/$','name'),
    (r'meta/$','display_meta'),
    )

urlpatterns += patterns('books.views',
    url(r'^show/','show'),
    url(r'search_form/$','search_form'),
    url(r'search/$','search'),
)

注意: urls.py与views.py文件是对应的,在views.py中定义函数,一定要添加到urls.py中去.

  • website/views.py文件是定义各种函数,便于使用,代码如下:
#coding=utf-8

from django.http import HttpResponse
import datetime

from django.template import loader
from django.shortcuts import render,render_to_response

def hello(request):
    return HttpResponse("Hello World")

def my_homepage_view(request):
    return HttpResponse("你好")

def current_datetime(request):
    now = datetime.datetime.now()
    html = "<html><body>It is now %s.</body></html>"%now
    return HttpResponse(html)

def hour_ahead(request,offset): #定义函数,这个函数名在urls.py文件中必须存在
    offset = int(offset)
    dt = datetime.datetime.now() + datetime.timedelta(hours = offset)
    html = "<html><body>In %s hour(s),it will be %s.</body></html>"%(offset,dt)
    return HttpResponse(html)

def xiaomi(request):
    t = loader.get_template("xiaomi.html")
    html = t.render({})
    return HttpResponse(html)

d = {'name':'zhangsan','age':'15'}  #可以引入字典
l = ['zhangsan','14']  #引入列表

#定义变量
class A:
    age = 11
a = A()

#定义函数
def fun():
    return "hello"

def name(request):

    today = 1 #1代表判断正确,输出结果;0代表错误,不输出结果
    #name_list = ['zhangsan','lisi','wangwu','zhanba']
    name_list = []

    t = loader.get_template("name.html")
    #html = t.render({'name':'zhangjianwei'}) #直接加入值
    #html = t.render({'name':fun})  #引用函数
    html = t.render({'name':fun,'today_is_weekend':today,'athlete_list':name_list})
    return HttpResponse(html)

def display_meta(request):
    values = request.META.items()
    values.sort()
    html= []
    path = request.path
    for (k,v) in values:
        html.append((k,v))
    return render_to_response('meta.html',{'meta_data':html,'request_path':path})

操作数据库使用到的命令:

  • mysql -u root -p连接用户名为root的数据库

  • show databases显示数据库

  • create database Bookdb default character set utf8 collate utf8_general_ci;创建一个Bookdb数据库并设置utf-8编码

  • use Bookdb;使用Bookdb数据库

  • show tables;显示数据库里的存在的项目名

  • select * from books_publisher;查询books_publisher数据库里的数据

    命令如图所示:
    命令

    这里写图片描述


### Django 连接 MySQL 数据库报错解决方案 当在 Django 开发环境中尝试连接MySQL 数据库时,可能会遇到多种类型的错误。以下是针对不同错误的具体解决方法。 #### 错误 1045 和 08001 的处理 如果收到类似于 `Error 1045 (28000): Access denied for user` 或者 `JDBC connect error 08001` 的消息,则表明存在权限或认证方面的问题。这通常是因为用户名、密码不匹配或是主机地址设置不当引起的[^1]。为了修正这个问题: - 验证所提供的登录凭证是否正确无误; - 确认 MySQL 用户具有足够的权限来访问指定的数据库实例; - 如果适用的话,调整防火墙规则允许来自应用程序服务器端口上的通信请求; 对于某些较新的 MySQL 版本,默认情况下启用了更严格的加密算法,可能需要通过修改配置文件中的参数(如 `default_authentication_plugin=mysql_native_password`),使得旧版客户端能够成功建立连接。 #### 处理缺少 pymysql 库的情况 另一个常见的问题是由于未安装必要的 Python 包而导致无法加载所需的模块。例如,在试图启动应用时遇到了这样的异常信息:“Did you install mysqlclient or MySQL-python?” 此类情况可以通过执行 pip 安装命令轻松解决: ```bash pip install PyMySQL ``` 之后还需要确保 Django 能够识别并使用这个驱动程序。可以在项目的 settings.py 文件顶部加入以下两行代码以完成此操作[^2]: ```python import pymysql pymysql.install_as_MySQLdb() ``` #### 修改数据库字符集防止中文乱码 最后一种情形涉及到了存储于数据库内的数据编码问题。特别是当中文字符显示为问号或其他不可读符号时,可能是表级别的默认字符集设定不够合适所致。可以按照下面给出的操作指南来进行相应的更改[^4]: - 使用 SQL 命令查看当前存在的所有数据库及其对应的字符集; - 对目标数据库内部的数据表逐一检查其定义语句,并记录下任何不符合 UTF-8 编码标准的部分; - 根据实际情况决定是重建整个表格还是仅更新特定字段的属性; 以上措施应该可以帮助克服大多数 DjangoMySQL 结合使用的障碍。当然,实际部署环境里还可能存在其他潜在因素影响着系统的正常运作,因此建议保持良好的日志记录习惯以便及时发现并解决问题根源所在。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值