通过pymysql可以使python能够轻松地操作数据库内容,而通过django的orm框架则可以更简单的操作数据库。

  • Mysql + pymysql
import pymysql

# 1、连接mysql
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='root', charset='utf8', db='database_name')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

# 2、发送指令
cursor.execute("insert into admin(username,password,mobile) values('zhangsan', '123', '15500009999')")
conn.commit()

# 3、关闭
cursor.close()
conn.close()
  • Django开发操作数据库

  • ` pymsql有一个源码的错误,需要在init中添加代码,可以安装 mysqlclient`避免

    • 如果用了pymsql,则需要在项目同名目录下的__init__中添加:

      import pymysql
      pymysql.install_as_MySQLdb()
      
  • ORM可以帮我们做两件事:
    • 创建、修改、删除数据库中的表(不用写SQL语句)。【无法创建数据库】
    • 操作表中得数据。(不用写SQL语句)
  • settings中增加外界数据库
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'database_name',
        'USER': 'root',
        'PASSWORD': 'root',
        'HOST': '127.0.0.1',
        'POST': 3306,
    }
}
  • django操作表

    • 在models.py中添加class
    from django.db import models
      
    # 新建表
    class UserInfo(models.Model):
        name = models.CharField(max_length=32)
        paw = models.CharField(max_length=32)
        age = models.IntergerField(default=20)
          
    """
    orm会自动转化执行语句:
    create table appname(相应app名称)_UserInfo(
    	id bigint quto_increment primary key,
    	name varchar(32),
    	password varchar(32)
    	age int
    );
    """
    
    # 新建数据
    UserInfo.objects.create(name='zhangsan',paw='123',age=23)
      
    # 删除数据
    UserInfo.objects.filter(id=3).delete()
    UserInfo.objects.all().delete()
    
    # 获取数据
    # data_list = [x,x,x,...]
    data_list = UserInfo.objects.all()
    # .first()得到一个对象,取的是第一条数据
    row_obj = UserInfo.objects.filter(id=2).first()
    for obj in data_list
    	print(obj.id, obj.name, obj.paw, obj.age)
          
    # 更新数据
    UserInfo.objects.all().update(age=23)
    UserInfo.objects.filter(id=45).update(age=56)
    
    • makemigrations
      migrate
      
    • app需要提前注册到settings里面

建立一个MODEL

当然,为了方便讲解,我们还是建立一个简单的Model:

from django.db import models

class BookInfo(models.Model):
    title = models.CharField(max_length=20, verbose_name='名称')
    number = models.IntegerField(default=0, verbose_name='数量')
    comment = models.IntegerField(default=0, verbose_name='评论数量')
    is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')

    class Meta:
        db_table = 'books'
        verbose_name = '图书'   # 在管理员admin站点中显示的名称

    def __str__(self):
        return self.btitle

class StudentInfo(models.Model):
	"""
	看是男是女
	"""
    GENDER_CHOICES = (
        (0, 'female'),
        (1, 'male')
    )
    class Meta:
        db_table = 'students'
        verbose_name = '学生'
    name = models.CharField(max_length=20, verbose_name='名称')
    #  default 为缺省值 这点很重要哦!!!
    gender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name='性别')
    info = models.CharField(max_length=200, null=True, verbose_name='信息')
    book = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name='图书名称') # 外键,不能省略
    is_delete = models.BooleanField(default=False, verbose_name='删除')

    def __str__(self):
        return self.hname

数据库操作(正题)

给数据库中模型增加元素

使用save方法

book=BookInfo(title='高等数学',number='10000',comment='400')
book.save()

上面这个等价于:

book=BookInfo()
book.title = 'xxx'
book.number = 'xxx'
book.comment = 'xxx'
book.save()

使用create方法

StudentInfo.objects.create(name='豪哥哥'gender='1',info='小可爱',book=book)

防止重复创建

🌂:首先尝试获取,不存在就创建,可以防止重复

StudentInfo.objects.get_or_create(name='豪哥哥'gender='1',info='小可爱',book=book)

🌂:最后一种方法返回一个元组,(object, True/False),创建时返回 True, 已经存在时返回 False

数据库内容的修改

使用update方法

当然filter中的查找条件也可以改为其他的后面会讲解

StudentInfo.objects.filter(info='小可爱').update(info='大可爱')

使用get方法配合save方法

🌂:关于__exact后面也会讲解的

# 两种方式
stu = StudentInfo.objects.get(gender__exact = 1)   # 可以且仅可以返回一条数据。 没有数据或返回多条数据都会抛异常。
stu = StudentInfo.objects.get(gender= 1)   # 简写形式 __exact可以省略。返回模型对象
stu.name = "小帅哥"
stu.save()

数据库内容的查询

get函数(上面提了这里不多讲)

(知道get返回一条数据就ok!)

all函数 (查询所有)

students = StudentInfo.objects.all()   # 查询所有,返回QuerySet查询集(可以遍历)

迭代用法如下所示:

stu = StudentInfo.objects.all()
for i in stu:
    print(i.name)

🌂:多说一点,如果想要知道数据库中有多少条数据,可以使用count方法

StudentInfo.objects.count()
结果简单来说就是有多少行很容易理解对吧

filter函数 (条件查询)

属性名称__比较运算符=你要修改的内容 注意了!!!敲重点!!! 属性名称和比较运算符间使用两个下划线,记住是两个

exact的使用

前面已经提到过,搬运工哈哈哈

# 两种方式
stu = StudentInfo.objects.get(gender__exact = 1)   # 可以且仅可以返回一条数据。 没有数据或返回多条数据都会抛异常。
stu = StudentInfo.objects.get(gender= 1)   # 简写形式 __exact可以省略。返回模型对象

contains、startswith、endswith(模糊查询)

从单词字面意思可知: contains:查询包含”某个值” statwith:以什么开头 endswith:以什么结尾 这里不给例子了

空值查询

🌂:查询学生名不为空的学生名

StudentInfo.objects.filter(title__isnull=False)

返回QuerySet对象:

<QuerySet [<BookInfo: 豪哥哥>, <BookInfo: 小哥哥>>

比较查询

gt :大于 (greater then) gte:大于等于 (greater then equal) lt :小于 (less then) lte :小于等于 (less then equal) 随便整一个例子:

BooktInfo.objects.filter(number__gte=200)

exclude函数 (filter函数取反)

查询number不为300的所有图书。

books = BookInfo.objects.exclude(number = 300)
 # 与filter函数作用相反
 #返回QuerySet查询集(可以遍历)

order_by函数 (排序)

books = BookInfo.objects.all().order_by('-number')   # 'id'表示升序; '-number'表示降序。
books = BookInfo.objects.order_by('-number')   #  其实.all()可以省略。 默认查询所有。最好还是加上吧!
# 对查询结果进行排序
# 返回QuerySet

暂时到这里吧,觉得基础比较实用的部分!