Django源码学习——MySQL

model里需要为每个字段设置类型,那有哪些类型?

  • 源码 db/backends/mysql/base.py
class DatabaseWrapper(BaseDatabaseWrapper):
    vendor = 'mysql'
	_data_types = {
		'AutoFiled': 'integer AUTO_INCREMENT', # 如果没有指明主键,就会产生一个自增的主键。
		'BigAutoField': 'bigint AUTO_INCREMENT',
		'BinaryFiled': 'longblob', # 存储原始二进制数据,仅支持字节分配。功能有限。
		'BooleanFiled': 'bool', # 布尔型和NullBooleanField有区别,true/false,本类型不允许出现null。
		'CharFiled': 'varchar(%max_length)s', # 字符串,一般都在创建时写入max_length参数。
		'CommaSeparatedIntegerField': 'varchar(%(max_length)s)', # 逗号分隔的整数,考虑到数据库的移植性,max_length参数应该必选。
		'DateFiled': 'date', # 时间,对应Python的datetime.date,额外的参数:DateField.auto_now表示是否每次修改时改变时间,DateField.auto_now_add 表示是否创建时表示时间,一般来说数据库重要的表都要有这样的字段记录创建字段时间个最后一次改变的时间。
		'DateTimeFiled': 'datetime', # 对应Python的datetime.datetime
		'DecimalField': 'numeric(%(max_length)s), %(decimal_places)s)', # 固定精度的十进制数,一般用来存金额相关的数据。对应python的Decimal,额外的参数包括DecimalField.max_digits和DecimalField.decimal_places。max_digits:数字允许的最大位数,decimal_places:小数的最大位数。
		'DurationField': 'bigint',
		'FileFiled': 'varchar(%(max_length)s)',
		'FilePathField': 'varchar(%(max_length)s)', # 类似于CharField,但是取值被限制为指定路径内的文件名,path参数是必选的。
		'FloatField': 'double precision', # 浮点数,必填参数:max_digits,数字长度;decimal_places,有效位数。
		'IntegerField': 'integer', # [-2147483648,2147483647 ]的取值范围对Django所支持的数据库都是安全的。
		'BigIntegerField': 'bigint', # 64位的整型数值,从 -2^63 (-9223372036854775808) 到 2^63-1(9223372036854775807)。
		'IPAddressField': 'char(15)', # 点分十进制表示的IP地址,如10.0.0.1
		'GenericIPAddressField': 'char(39)', # ip v4和ip v6地址表示,ipv6遵循RFC 4291section 2.2,
		'NullBooleanField': 'bool', # 可以包含空值的布尔类型,相当于设置了null=True的BooleanField。
		'OneToOneField': 'integer' # ?
		'PositiveIntegerField': 'integer UNSIGNED', # 正整数或0类型,取值范围为[0 ,2147483647]
		'PositiveSmallIntegerField': 'smallint UNSIGNED', # 正短整数或0类型,类似于PositiveIntegerField,取值范围依赖于数据库特性,[0 ,32767]的取值范围对Django所支持的数据库都是安全的。
        'SlugField': 'varchar(%(max_length)s)', # 只能包含字母,数字,下划线和连字符的字符串,通常被用于URLs表示。可选参数max_length=50,prepopulate_from用于指示在admin表单中的可选值。db_index,默认为True。
        'SmallIntegerField': 'smallint', # 小整数字段,类似于IntegerField,取值范围依赖于数据库特性,[-32768 ,32767]的取值范围对Django所支持的数据库都是安全的。
        'TextField': 'longtext',
        'TimeField': 'time', # 时间,对应Python的datetime.time
        'UUIDField': 'char(32)', # ?
}

可能不全

    operators = {
        'exact': '= %s',
        'iexact': 'LIKE %s',
        'contains': 'LIKE BINARY %s', # 区分大小写
        'icontains': 'LIKE %s',
        'regex': 'REGEXP BINARY %s', # 区分大小写
        'iregex': 'REGEXP %s',
        'gt': '> %s',
        'gte': '>= %s',
        'lt': '< %s',
        'lte': '<= %s',
        'startswith': 'LIKE BINARY %s',
        'endswith': 'LIKE BINARY %s',
        'istartswith': 'LIKE %s',
        'iendswith': 'LIKE %s',
    }
    
    pattern_esc = r"REPLACE(REPLACE(REPLACE({}, '\\', '\\\\'), '%%', '\%%'), '_', '\_')" # TODO 这个干啥的?
    pattern_ops = {
        'contains': "LIKE BINARY CONCAT('%%', {}, '%%')",
        'icontains': "LIKE CONCAT('%%', {}, '%%')",
        'startswith': "LIKE BINARY CONCAT({}, '%%')",
        'istartswith': "LIKE CONCAT({}, '%%')",
        'endswith': "LIKE BINARY CONCAT('%%', {})",
        'iendswith': "LIKE CONCAT('%%', {})",
    }

以上所有代码均为手抄,可能有一定的错误。

发布了151 篇原创文章 · 获赞 73 · 访问量 29万+

猜你喜欢

转载自blog.csdn.net/liyuxing6639801/article/details/103378891