Django配置数据库
DATABASES = {
'default': {
# 数据库引擎(sqlite3,mysql,oracle等)
'ENGINE': 'django.db.backends.mysql',
# 数据库的名字
'NAME': 'django_db1',
# 连接数据库的用户名
'USER': 'root',
# 数据库的密码
'PASSWORD': '123456',
# 数据库的主机地址
'HOST': '127.0.0.1',
# 数据库的端口号
'PORT': '3306'
}
}
django中操作数据
# 使用Django封装好的connection对象,会自动读取setting.py中数据库的配置信息
from django.db import connection
# 获取游标对象
cursor = connection.cursor()
# 拿到游标对象后只需sql语句
cursor.execute("select id,name,author from book")
# 获取所有数据
rows = cursor.fetchall()
# 遍历查询到的数据
for row in rows:
print(row)
python db api规范下cursor对象常用接口:
rowcount
:代表在执行了sql语句受影响的行数close
: 关闭游标。关闭之后不能再使用否则会抛异常excute.execute(sql[,parameters])
:执行某个sql语句。如果执行sql语句的时候还需要传递参数,那么可以传给parameters
参数。
cursor.execute("select * from book where id=%s",(1,))
fetchone
: 在执行了查询操作以后,获取第一条数据fetchmany(size)
: 在执行查询操作以后,获取多条数据。具体多少条要看传的size
参数,如果size
不传默认一条fetchall
:获取所有满足sql语句的数据
Python ORM模型
将ORM
模型映射到数据库中,需要如下几步:
- 在
setting.py
中配置好DATABASE
,做好数据库相关的配置 - 在app中
models.py
中定义好模型,这个模型必须继承自Django.db.models
- 将这个app添加
setting.py
的INSTALLED_APP
中 - 在命令终端,在项目路径所在路径,然后执行命令
Python manage.py makemigrations
来生成迁移脚本文件。 - 同样在命令行中,执行命令
python manage.py migrate
来将迁移脚本文件映射到数据库中
本人英语比较菜鸡所有在pycharm里找到了可以快捷生成表的
ORM对数据库增删改查
- 增’
1.使用orm添加一条数据到数据库中
book = Book(name='西游记',author='吴承恩',price=100) # 字段=值
book.save()
- 删
book = Book.objects.get(pk=1) # pk=primary_key:主键 删除主键字段等于1的数据
book.delete()
- 改
book = Book.objects.get(pk=1)
book.price = 200 # 要修改的字段 修改的值
book.save() # 保存修改后的值
- 查
# 1.根据主键进行查找 primary key简写 pk
book = Book.objects.get(pk=1)
# 2.根据其他条件查找
book = Book.objects.filter('<字段名>'='<条件>').first() '第一个值'
ORM常用Field
AutoField:
映射到数据库中int类型,可以有自增长的特性。一般不需要使用这个类型,如果不指定主键,那么模型会自动的生成一个叫做id的自增长的主键。如果想指定其他名字的并且自动增长的主键,使用AutoField也可以
BigAutoField:
64位的整形,类似于AutoField,只不过是产生的数据范围是从1-992335353536364
BooleanField:
在模型层面接收的是True/False。在数据库层面是tinyint类型。如果没有指定默认值,默认值就是None。
charField:
对应数据库的varchar类型。必须指定最大的长度(max_length=最大长度)
DateField
日期类型。在
python
中是datetime.date
类型,可以记录年月日。在映射到数据库中也是date
类型。使用这个field
可以传递以下几个参数:
- auto_now: 每次这个对象调用save方法的时候都会去将当前的时间更新
- auto_now_add: 是在第一次添加数据进去的时候会自动获取当前的时间
DateTimeField
日期时间类型,类似于
datefield
。不仅仅可以存储日期,还可以存储时间。映射到数据库中是datetime
类型。这个field
也可以使用auto_now
和auto_now_add
两个属性。
TimeField
时间类型。在数据库中是
time
类型。在python
中是datetime.time
类型。
EmailField
类似于
charField
。 在数据库底层也是一个varchar
类型。最大长度是254个字符。
FileField
用来存储文件的
ImageField
用来存储图片文件的
FloatField
浮点类型。映射到数据库中是
fload
类型
整形
bigIntegerField
大整形
PositiveIntegerField
正整形。 值的区间是
0-2147483647
小整形
小整形。 值的区间是
-32768-32767
PostiveSmallIntegerField
正小整形。值的区间是
0-32767
TextField
大量的文本类型。映射到数据库中的是
loggetext
类型
UUIDField
只能存储
uuid
格式的字符串。uuid
是一个32位的全球唯一的字符串。一般用来作为主键。
URLField
类似于
charField
,只不过只能用来存储url
格式的字符串。并且默认的max_length
是200。
Field的常用参数
null
blank
表示这个字段在表单验证的时候是否可以为空。默认是false。这个和null是有区别的,null是一个纯数据库级别的
db_column
这个字段在数据库中的名字。如故没有设置这个参数,那么将会使用模型中属性的名字。
default
默认值。可以为一个值,或者是一个函数,但是不支持
lambda
表达式。并且不支持列表/字典/集合等可变的数据结构。
primary_key
是否为主键。默认是
False
。
uuique
在表中这个字段的值是否唯一。一般设置手机号码/邮箱等。
模型中的Meta配置
class Book(models.model):
name = models.CharField(max_length=20,null=false)
class Meta:
db_table='book_model' # 数据库表名
ordering
设置在提取数据的排序方式。如果在查找字段前面加个
-
那么久倒叙排列。
外键和表关系
外键:
- 定义为
class Foreignkey(to,on_delete,**options)
- 第一个参数是引用的是哪个模型
- 第二个参数是使用外键引用的模型数据被删除了,该字段如何处理
class Category(models.Model):
name = models.CharField(u'分类', max_length=100)
class Meta:
db_table ='Category'
class User(models.Model):
tiele = models.CharField(u'名称', max_length=100)
content = models.TextField(u'内容')
Category = models.ForeignKey("Category", on_delete=models.CASCADE)
class Meta:
db_table = 'User'
# 如果需要引用另外app下模型作为外键
# app.模型的名字
# 如果模型的外键引用的是本身自己这个模型,那么to参数可以为`self`,或者是这个模型的名称。
外键删除操作:
CASCADE
:级联操作。如果外键对应的那条数据被删除了,那么这条数据也会被删除。PROTECT
:受保护。即只要纸条数据引用了外键的那条数据,那么就不能删除外键的那条数据。SET_NULL
:设置默认值。如果外键的那条数据被删除了,那么在本条数据上就将这个字段设置为空。如果设置这个选项,前提是要指定这个字段可以为空。SET_DEFAULT
:设置默认值。如果外键的那条数据被删除了,那么本数据上就将这个字段设置为默认值。如果设置这个选项,前提示是要指定这个字段一个默认值。SET()
: 如果外键的那条数据被删除了。那么将会获取SET
函数中的值来作为这个外键的值。SET
函数可以接收一个可以调用的对象(比如函数或者方法),如果是可以调用的对象,那么会将这个对象调用后的结果作为值返回回去。DO_NOTHING
:不采取任何行为。一切全看数据库级别的约束。
表关系
一对多
一对一:
- 在Django中一对一是通过
models.OneToOneFiel
来实现的。这个OneToOneFiel
其实本质上就是一个外键,只不过这个外键有一个唯一约束(unique key)
,来实现一对一。 - 以后如何想要反向应用,那么是通过引用的模型的名字转换为小写的形式进行访问。例如下面模型:
class Student(models.Model):
Studentname = models.CharField(max_length=100)
class StudnetExtension(models.Model):
School = models.CharField(max_length=100)
Student = models.OneToOneField("Student", on_delete=models.CASCADE, related_name="extension")
StudnetExtension
的对象,可以通过Student
来访问对应Studnet
对象。并且Student
对象可以使用StudnetExtension
来访问对应的的StudnetExtension
对象。
如果不想使用Django默认的引用属性,那么可以在models.OneToOneField
中添加一个related_name
参数。那么以后就可以通过related_name
设置的名称进行访问。
多对多:
- 实现多对多的方式
django
专门提供了一个Field
。叫做ManyToManyField
。示例代码如下:
# 多对多
class shuming(models.Model):
title = models.CharField("书名", max_length=100)
content = models.TextField("内容")
class Meta:
db_table = "shuming"
class Tag(models.Model):
name = models.CharField("标签名称", max_length=100)
shuming = models.ManyToManyField("shuming")
class Meta:
db_table = "tag"
在数据库层面,实际上django
是为这种多对多的关系建立了一个中间表。这个中间表分别定义了两个外键,引用了模型中两张表的主键。