程序涉及到数据库相关操作时,一般都会这样:
-
创建数据库,设计表结构和字段
-
使用 pymysql 来连接数据库,并编写数据访问层代码
-
业务逻辑层去调用数据访问层执行数据库操作
import pymysql def get_list(sql): db = pymysql.connect(user='root', db='db1', passwd='123456', host='localhost') cursor = db.cursor() cursor.execute(sql) data = cursor.fetchall() db.close() return data
Django为使用一种新的方式,即:关系对象映射(Object Relational Mapping,简称ORM)。
PHP:activerecord
Java:Hibernate
C#:Entity Framework
Django中遵循 Code Frist 的原则,即:根据代码中定义的类来自动生成数据库表
| 一 创建表 |
1. 基本结构
from django.db import models class UserInfo(models.Model): name = models.CharField(max_length=32) email = models.EmailField() memo = models.TextField() num = models.IntegerField(null=True, blank=True, default=0) ctime = models.DateTimeField(auto_now=True) def __str__(self): return self.name
# modes字段类型 AutoField int自增列,必须填入参数 primary_key=True BigAutoField bigint自增列,必须填入参数 primary_key=True 注:当model中如果没有自增列,则自动会创建一个列名为id的列 SmallIntegerField 小整数 -32768 ~ 32767 PositiveSmallIntegerField 正小整数 0 ~ 32767 IntegerField 整数列(有符号的) -2147483648 ~ 2147483647 PositiveIntegerField 正整数 0 ~ 2147483647 BigIntegerField 长整型(有符号的) -9223372036854775808 ~ 9223372036854775807 自定义无符号整数字段 class UnsignedIntegerField(models.IntegerField): def db_type(self, connection): return 'integer UNSIGNED' PS: 返回值为字段在数据库中的属性,Django字段默认的值为: 'AutoField': 'integer AUTO_INCREMENT', 'BigAutoField': 'bigint AUTO_INCREMENT', 'BinaryField': 'longblob', 'BooleanField': 'bool', 'CharField': 'varchar(%(max_length)s)', 'CommaSeparatedIntegerField': 'varchar(%(max_length)s)', 'DateField': 'date', 'DateTimeField': 'datetime', 'DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)', 'DurationField': 'bigint', 'FileField': 'varchar(%(max_length)s)', 'FilePathField': 'varchar(%(max_length)s)', 'FloatField': 'double precision', 'IntegerField': 'integer', 'BigIntegerField': 'bigint', 'IPAddressField': 'char(15)', 'GenericIPAddressField': 'char(39)', 'NullBooleanField': 'bool', 'OneToOneField': 'integer', 'PositiveIntegerField': 'integer UNSIGNED', 'PositiveSmallIntegerField': 'smallint UNSIGNED', 'SlugField': 'varchar(%(max_length)s)', 'SmallIntegerField': 'smallint', 'TextField': 'longtext', 'TimeField': 'time', 'UUIDField': 'char(32)', BooleanField 布尔值类型 NullBooleanField 可以为空的布尔值 CharField 字符类型,必须提供max_length参数, max_length表示字符长度 TextField 文本类型 EmailField 字符串类型,Django Admin以及ModelForm中提供验证机制 IPAddressField 字符串类型,Django Admin以及ModelForm中提供验证 IPV4 机制 GenericIPAddressField 字符串类型,Django Admin以及ModelForm中提供验证 Ipv4和Ipv6 - protocol,用于指定Ipv4或Ipv6, 'both',"ipv4","ipv6" - unpack_ipv4, 如果指定为True,则输入::ffff:192.0.2.1时候,可解析为192.0.2.1,开启刺功能,需要protocol="both" URLField 字符串类型,Django Admin以及ModelForm中提供验证 URL SlugField 字 符串类型,Django Admin以及ModelForm中提供验证支持 字母、数字、下划线、连接符(减号) UUIDField 字符串类型,Django Admin以及ModelForm中提供对UUID格式的验证 FilePathField - 字符串,Django Admin以及ModelForm中提供读取文件夹下文件的功能 - 参数: path, 文件夹路径 match=None, 正则匹配 recursive=False, 递归下面的文件夹 allow_files=True, 允许文件 allow_folders=False, 允许文件夹 FileField - 字符串,路径保存在数据库,文件上传到指定目录 - 参数: upload_to = "" 上传文件的保存路径 storage = None 存储组件,默认django.core.files.storage.FileSystemStorage ImageField(FileField) - 字符串,路径保存在数据库,文件上传到指定目录 - 参数: upload_to = "" 上传文件的保存路径 storage = None 存储组件,默认django.core.files.storage.FileSystemStorage width_field=None, 上传图片的高度保存的数据库字段名(字符串) height_field=None 上传图片的宽度保存的数据库字段名(字符串) DateTimeField 日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] DateField 日期格式 YYYY-MM-DD TimeField 时间格式 HH:MM[:ss[.uuuuuu]] DurationField 长整数,时间间隔,数据库中按照bigint存储,ORM中获取的值为datetime.timedelta类型 FloatField 浮点型 DecimalField -10进制小数 - 参数: max_digits,小数总长度 decimal_places,小数位长度 BinaryField 二进制类型 # 更多信息参考 https://docs.djangoproject.com/en/1.11/ref/models/fields/