Django数据库MySQL的操作

1.数据库的配置

  • 安装pymysql模块
    pip install pymysql
  • 在settings文件中配置
import pymysql         # 一定要添加这两行
pymysql.install_as_MySQLdb()
# 修改DATABASES的值
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mysite',
        'HOST': '192.168.111.100',
        'USER': 'user',
        'PASSWORD': 'pwd',
        'PORT': '3306',
    }
}
  • 修改时区
TIME_ZONE = Asia/Shanghai

2.数据库模型类models

from django.db import models
class UserInfo(models.Model):
	# 自增长ID,必须带参数为primary_key=True,并且是唯一主键
    uid = models.AutoField(primary_key=True)
    
    # 字符串类型,最大长度为10
    user = models.CharField(max_length=10)
    
    # 数字类型,默认为1
    age = models.IntegerField(default=1)
    
     # BOOL类型
    sex = models.BooleanField()
   
    # 自带检查 Email 合法性的 CharField
    email = models.EmailField()
    
    # 长文本类型
    Intor = models.TextField()
   
    Blog = models.URLField()
    # 自带检查 URL 合法性的 CharField

    # -------------------文件上传-----------------
    # 文件上传到 MEDIA_ROOT/uploads
    # 这个字段不能设置primary_key和unique选项.在数据库中存储类型是varchar,默认最大长度为100.
    upload = models.FileField(upload_to='uploads/')
    
    # 文件上传到 MEDIA_ROOT/uploads/2020/01/06
    upload_s = models.FileField(upload_to='uploads/%Y/%m/%d/')
    

    upload_e = models.FilePathField(path="/home/images", match="foo.*", recursive=True)
    # 这个字段的值被限制在系统上某个目录中的所有文件名集合中。有三个参数
    #     path = '':  该参数必需。上行所说的‘某个目录’的绝对路径。Example: "/home/images".
    #     match = 'pattern':  可选参数。格式是正则表达式。匹配符合正则表达式的文件
    #     recursive = True / False: 可选参数,默认为False。设定是否递归该目录下所有子目录的所有文件

	# 设置初次创建的时间
    add_date = models.DateTimeField(auto_now_add=True)
   
   	# 设置最后修改的时间
    update_date = models.DateTimeField(auto_now=True)

3.设置好models类后创建数据库进行迁移操作

  • 在项目根目录下执行 python manage.py makemigrations 生成迁移文件 ,在实际项目开发的时候,要保存每次迁移文件到git上,这样对模型类的每次改变都可以通过执行迁移文件对模型类就行修改
  • 迁移文件,settings.py 文件里连接的数据库,执行 python manage.py migrate ,如果之前迁移过,会检查数据库中的 django_migrations 表里保存的迁移记录,这样就把数据库模型类迁移到你连接的数据库中了。

4.数据操作

4.1 增加数据
  • 常规增加数据
data.objects.create(User='陈二狗')
# 或者稍微复杂点
datas = data()
datas.User = '陈二狗'
datas.save()
  • 外键的情况
class A:
    user = models.CharField(max_length=5)
    area = models.ForeignKey('B',on_delete=models.DO_NOTHING)
class B:
    area = models.CharField(max_length=10)
# 添加数据
b = B()
b.area='上海'
b.save()
a = A()
a.user='xiaoming'
a.area = b
a.save()
4.2 查看数据
  • data.objects.all() 获取这个表里的所有数据
  • data.objects.get(id=1) 获取主键id=2的一个,查询不到会报错,最好外层加try except
  • data.objects.filter(id=2, name=‘xiaoming’) filter查询出来的是对象列表 filter的条件可以有多个
  • data.objects.exclude(id=2) 查询id除了2的其他结果
  • data.objects.order_by(name) 查询按name排序后的结果
  • data.objects.first(name=’小明’) 查询符合条件的第一个对象
  • data.objects.last(name=“xiaoming”) 查询符合条件的第一个对象
4.3 修改数据
users = data.objects.filter(User='陈二狗')
users.User = '浪子'
users.asve()

# update 适合更新批量数据,执行速度比save更快
data.objects.filter(User='陈二狗').update(User='浪子')
4.4 删除数据
  • 查询结果集对象后面添加 delete()
data.objects.filter(User='陈二狗').delete()
# 外键关联的时候,如果删除则不做任何事
user = models.ForeignKey(User,on_delete=models.DO_NOTHING)

5.任务线程数据库连接失效处理(高并发)

  • 在Django使用中可能会报 InterfaceError 的错误,这是由于Django每次都会都会发起新的连接,线程池处理任务时,正常使用的连接不会被关闭,但由于数据库端有最长连接时间的限制(默认是8小时),在超时后会发生InterfaceError 或者 Error(2006, ‘MySQL server has gone away’),在这个线程的代码中我们可以调用 django.db.connection.close() 来进行关闭操作
  • 或者每次请求之前都进行失效连接的关闭处理
from django.db import close_old_connections

# 源码
# Register an event to reset transaction state and close connections past
# their lifetime.
def close_old_connections(**kwargs):
    for conn in connections.all():
        conn.close_if_unusable_or_obsolete()

def cron_task():
	
	close_old_connections()
	# 执行模型类的查询
	pass
发布了19 篇原创文章 · 获赞 10 · 访问量 2448

猜你喜欢

转载自blog.csdn.net/qq_40125653/article/details/103854306
今日推荐