ORM

就是用面向对象的方式去操作数据库的创建表以及增删改查等操作

到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞:

  • 创建数据库,设计表结构和字段
  • 使用 MySQLdb 来连接数据库,并编写数据访问层代码
  • 业务逻辑层去调用数据访问层执行数据库操作
import MySQLdb

def GetList(sql):
db = MySQLdb.connect(user='root', db='wupeiqidb', passwd='', host='localhost')
cursor = db.cursor()
cursor.execute(sql)
data = cursor.fetchall()
db.close()
return data def GetSingle(sql):
db = MySQLdb.connect(user='root', db='wupeiqidb', passwd='', host='localhost')
cursor = db.cursor()
cursor.execute(sql)
data = cursor.fetchone()
db.close()
return data

django为使用一种新的方式,即:关系对象映射(Object Relational Mapping,简称ORM)

一、创建表

1、基本结构

注意:

  1、创建表的时候,如果我们不给表加自增列,生成表的时候会默认给我们生成一列为ID的自增列,当然我们也可以自定义

  2、如果我们给某一列设置了外键的时候,生成表的时候,该列的表名会自动生成auter_id(即俩个字段中间用_连接起来)

  3、创建外键的时候 models.ForeignKey(UserType)  ForeignKey中参数代表的类必须在其上面,否则就必须写成字符串的形式

from django.db import models

class userinfo(models.Model):
nid = models.AutoField(primary_key=True)
name = models.CharField(max_length=30)
email = models.EmailField()
memo = models.TextField() class Meta:
verbose_name = '用户名'
verbose_name_plural = verbose_name def __str__(self): #相当于tornado中的__repr__
return self.name
class Host_To_Group(models.Model):
nid = models.AutoField(primary_key=True)
host_id = models.ForeignKey('Host')
group_id = models.ForeignKey('Group')
class Meta:
index_together = ('host_id','Group') #联合索引
unique_together = [ #联合唯一索引
('host_id', 'Group')
]
1、models.AutoField  自增列 = int(11)
  如果没有的话,默认会生成一个名称为 id 的列,如果要显示的自定义一个自增列,必须将给列设置为主键 primary_key=True。
2、models.CharField  字符串字段
  必须 max_length 参数
3、models.BooleanField  布尔类型=tinyint(1)
  不能为空,Blank=True
4、models.ComaSeparatedIntegerField  用逗号分割的数字=varchar
  继承CharField,所以必须 max_lenght 参数
5、models.DateField  日期类型 date
  对于参数,auto_now = True 则每次更新都会更新这个时间;auto_now_add 则只是第一次创建添加,之后的更新不再改变。
6、models.DateTimeField  日期类型 datetime
  同DateField的参数
7、models.Decimal  十进制小数类型 = decimal
  必须指定整数位max_digits和小数位decimal_places
8、models.EmailField  字符串类型(正则表达式邮箱) =varchar
  对字符串进行正则表达式
9、models.FloatField  浮点类型 = double
10、models.IntegerField  整形
11、models.BigIntegerField  长整形
  integer_field_ranges = {
    'SmallIntegerField': (-32768, 32767),
    'IntegerField': (-2147483648, 2147483647),
    'BigIntegerField': (-9223372036854775808, 9223372036854775807),
    'PositiveSmallIntegerField': (0, 32767),
    'PositiveIntegerField': (0, 2147483647),
  }
12、models.IPAddressField  字符串类型(ip4正则表达式)
13、models.GenericIPAddressField  字符串类型(ip4和ip6是可选的)
  参数protocol可以是:both、ipv4、ipv6
  验证时,会根据设置报错
14、models.NullBooleanField  允许为空的布尔类型
15、models.PositiveIntegerFiel  正Integer
16、models.PositiveSmallIntegerField  正smallInteger
17、models.SlugField  减号、下划线、字母、数字
18、models.SmallIntegerField  数字
  数据库中的字段有:tinyint、smallint、int、bigint
19、models.TextField  字符串=longtext
20、models.TimeField  时间 HH:MM[:ss[.uuuuuu]]
21、models.URLField  字符串,地址正则表达式
22、models.BinaryField  二进制
23、models.ImageField 图片
24、models.FilePathField 文件

更多字段1

AutoField
一个 IntegerField, 添加记录时它会自动增长. 你通常不需要直接使用这个字段; 如果你不指定主键的话,系统会自动添加一个主键字段到你的 model.(参阅 _自动主键字段)
BooleanField
A true/false field. admin 用 checkbox 来表示此类字段.
CharField
字符串字段, 用于较短的字符串. 如果要保存大量文本, 使用 TextField. admin 用一个 <input type="text"> 来表示此类字段 (单行输入). CharField 要求必须有一个参数 maxlength, 用于从数据库层和Django校验层限制该字段所允许的最大字符数. CommaSeparatedIntegerField
用于存放逗号分隔的整数值. 类似 CharField, 必须要有 maxlength 参数.
DateField
一个日期字段. 共有下列额外的可选参数: Argument 描述
auto_now 当对象被保存时,自动将该字段的值设置为当前时间.通常用于表示 "last-modified" 时间戳.
auto_now_add 当对象首次被创建时,自动将该字段的值设置为当前时间.通常用于表示对象创建时间.
admin 用一个文本框 <input type="text"> 来表示该字段数据(附带一个 JavaScript 日历和一个"Today"快键. DateTimeField
一个日期时间字段. 类似 DateField 支持同样的附加选项.
admin 用两上文本框 <input type="text"> 表示该字段顺序(附带JavaScript shortcuts). EmailField
一个带有检查 Email 合法性的 CharField,不接受 maxlength 参数.
FileField
一个文件上传字段. 要求一个必须有的参数: upload_to, 一个用于保存上载文件的本地文件系统路径. 这个路径必须包含 strftime formatting, 该格式将被上载文件的 date/time 替换(so that uploaded files don't fill up the given directory). admin 用一个``<input type="file">``部件表示该字段保存的数据(一个文件上传部件) . 在一个 model 中使用 FileField 或 ImageField 需要以下步骤: 在你的 settings 文件中, 定义一个完整路径给 MEDIA_ROOT 以便让 Django在此处保存上传文件. (出于性能考虑,这些文件并不保存到数据库.) 定义 MEDIA_URL 作为该目录的公共 URL. 要确保该目录对 WEB 服务器用户帐号是可写的.
在你的 model 中添加 FileField 或 ImageField, 并确保定义了 upload_to 选项,以告诉 Django 使用 MEDIA_ROOT 的哪个子目录保存上传文件.
你的数据库中要保存的只是文件的路径(相对于 MEDIA_ROOT). 出于习惯你一定很想使用 Django 提供的 get_<fieldname>_url 函数.举例来说,如果你的 ImageField 叫作 mug_shot, 你就可以在模板中以 {{ object.get_mug_shot_url }} 这样的方式得到图像的绝对路径.
FilePathField
可选项目为某个特定目录下的文件名. 支持三个特殊的参数, 其中第一个是必须提供的. 参数 描述
path 必需参数. 一个目录的绝对文件系统路径. FilePathField 据此得到可选项目. Example: "/home/images".
match 可选参数. 一个正则表达式, 作为一个字符串, FilePathField 将使用它过滤文件名. 注意这个正则表达式只会应用到 base filename 而不是路径全名. Example: "foo.*\.txt^", 将匹配文件 foo23.txt 却不匹配 bar.txt 或 foo23.gif.
recursive 可选参数.要么 True 要么 False. 默认值是 False. 是否包括 path 下面的全部子目录.
这三个参数可以同时使用. 我已经告诉过你 match 仅应用于 base filename, 而不是路径全名. 那么,这个例子: FilePathField(path="/home/images", match="foo.*", recursive=True)
...会匹配 /home/images/foo.gif 而不匹配 /home/images/foo/bar.gif FloatField
一个浮点数. 必须 提供两个 参数: 参数 描述
max_digits 总位数(不包括小数点和符号)
decimal_places 小数位数
举例来说, 要保存最大值为 999 (小数点后保存2位),你要这样定义字段: models.FloatField(..., max_digits=5, decimal_places=2)
要保存最大值一百万(小数点后保存10位)的话,你要这样定义: models.FloatField(..., max_digits=19, decimal_places=10)
admin 用一个文本框(<input type="text">)表示该字段保存的数据. ImageField
类似 FileField, 不过要校验上传对象是否是一个合法图片.它有两个可选参数:height_field 和 width_field,如果提供这两个参数,则图片将按提供的高度和宽度规格保存. 该字段要求 Python Imaging Library. IntegerField
用于保存一个整数. admin 用一个``<input type="text">``表示该字段保存的数据(一个单行编辑框) IPAddressField
一个字符串形式的 IP 地址, (i.e. "24.124.1.30"). admin 用一个``<input type="text">``表示该字段保存的数据(一个单行编辑框) NullBooleanField
类似 BooleanField, 不过允许 NULL 作为其中一个选项. 推荐使用这个字段而不要用 BooleanField 加 null=True 选项. admin 用一个选择框 <select> (三个可选择的值: "Unknown", "Yes" 和 "No" ) 来表示这种字段数据. PhoneNumberField
一个带有合法美国风格电话号码校验的 CharField``(格式: ``XXX-XXX-XXXX).
PositiveIntegerField
类似 IntegerField, 但取值范围为非负整数(这个字段应该是允许0值的....所以字段名字取得不太好,无符号整数就对了嘛).
PositiveSmallIntegerField
类似 PositiveIntegerField, 取值范围较小(数据库相关)
SlugField
"Slug" 是一个报纸术语. slug 是某个东西的小小标记(短签), 只包含字母,数字,下划线和连字符.它们通常用于URLs. 若你使用 Django 开发版本,你可以指定 maxlength. 若 maxlength 未指定, Django 会使用默认长度: 50. 在以前的 Django 版本,没有任何办法改变 50 这个长度. 这暗示了 db_index=True. 它接受一个额外的参数: prepopulate_from, which is a list of fields from which to auto-populate the slug, via JavaScript, in the object's admin form: models.SlugField(prepopulate_from=("pre_name", "name"))
prepopulate_from 不接受 DateTimeFields. admin 用一个``<input type="text">``表示 SlugField 字段数据(一个单行编辑框) SmallIntegerField
类似 IntegerField, 不过只允许某个取值范围内的整数.(依赖数据库) TextField
一个容量很大的文本字段. admin 用一个 <textarea> (文本区域)表示该字段数据.(一个多行编辑框). TimeField
A time. Accepts the same auto-population options as DateField 和 DateTimeField. admin 用一个 <input type="text"> 文本框表示该字段保存的数据(附加一些JavaScript shortcuts). URLField
用于保存 URL. 若 verify_exists 参数为 True (默认), 给定的 URL 会预先检查是否存在(即URL是否被有效装入且没有返回404响应). admin 用一个 <input type="text"> 文本框表示该字段保存的数据(一个单行编辑框) USStateField
一个两字母的美国州名缩写. admin 用一个 <input type="text"> 文本框表示该字段保存的数据(一个单行编辑框) XMLField
一个校验值是否为合法XML的 TextField,必须提供参数: schema_path, 它是一个用来校验文本的 RelaxNG schema 的文件系统路径.

更多字段2

1、null=True
  数据库中字段是否可以为空
2、blank=True
  django的 Admin 中添加数据时是否可允许空值
3、primary_key = False
  主键,对AutoField设置主键后,就会代替原来的自增 id 列
4、auto_now 和 auto_now_add
  auto_now 自动创建---无论添加或修改,都是当前操作的时间
  auto_now_add 自动创建---永远是创建时的时间
5、choices
GENDER_CHOICE = (
(u'M', u'Male'),
(u'F', u'Female'),
)
gender = models.CharField(max_length=2,choices = GENDER_CHOICE)
6、max_length
7、default  默认值
8、verbose_name  Admin中字段的显示名称
9、name|db_column  数据库中的字段名称
10、unique=True  不允许重复
11、db_index = True  数据库索引
12、editable=True  在Admin里是否可编辑
13、error_messages=None  错误提示
14、auto_created=False  自动创建
15、help_text  在Admin中提示帮助信息
16、validators=[]
17、upload-to

更多参数

通过内部类Meta给数据模型类增加扩展属性:

class Meta:

verbose_name='名称'      #表名由英文转换成中文了

verbose_name_plural='名称复数形式'

ordering='排序字段'

2、连表结构(当我们在类中写上这样的字段后,就会为我们自动创建一张关系表)

  • 一对多:models.ForeignKey(其他表)
  • 一对多:就是主外键关系;
  • 多对多:models.ManyToManyField(其他表)
  • 多对多:多个主外键的关系
  • 一对一:models.OneToOneField(其他表)
  • 一对一:实质就是在主外键的关系基础上,给外键加了一个UNIQUE的属性

二、操作表

1、基本操作

-------------------用于获取后台提交的数据----------------------

username=req.POST.get('username')
password=req.POST.get('password')

----------------------------------------------------------------

    增

    models.Tb1.objects.create(c1='xx', c2='oo')  增加一条数据,可以接受字典类型数据 **kwargs

    obj = models.Tb1(c1='xx', c2='oo')
obj.save() 查 models.Tb1.objects.get(id=) # 获取单条数据,不存在则报错(不建议)
models.Tb1.objects.all() # 获取全部
models.Tb1.objects.filter(name='seven') # 获取指定条件的数据 删 models.Tb1.objects.filter(name='seven').delete() # 删除指定条件的数据 改
models.Tb1.objects.filter(name='seven').update(gender='') # 将指定条件的数据更新,均支持 **kwargs
obj = models.Tb1.objects.get(id=)
obj.c1 = ''
obj.save() # 修改单条数据

基本操作---增删改查

2、进阶操作(了不起的双下划线)

利用双下划线将字段和对应的操作连接起来

    获取个数

    models.Tb1.objects.filter(name='seven').count()

    大于,小于

    models.Tb1.objects.filter(id__gt=1)              # 获取id大于1的值
models.Tb1.objects.filter(id__lt=10) # 获取id小于10的值
models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值 in models.Tb1.objects.filter(id__in=[11, 22, 33]) # 获取id等于11、22、33的数据
models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in contains models.Tb1.objects.filter(name__contains="ven")
models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感
models.Tb1.objects.exclude(name__icontains="ven") range models.Tb1.objects.filter(id__range=[1, 2]) # 范围bettwen and 其他类似 startswith,istartswith, endswith, iendswith, order by models.Tb1.objects.filter(name='seven').order_by('id') # asc
models.Tb1.objects.filter(name='seven').order_by('-id') # desc limit 、offset models.Tb1.objects.all()[10:20] group by
from django.db.models import Count, Min, Max, Sum
models.Tb1.objects.filter(c1=1).values('id').annotate(c=Count('num'))
SELECT "app01_tb1"."id", COUNT("app01_tb1"."num") AS "c" FROM "app01_tb1" WHERE "app01_tb1"."c1" = 1 GROUP BY "app01_tb1"."id"

进阶操作

3、连表操作(了不起的双下划线)

对象.query---------------------查看代码的sql语句

利用双下划线和 _set 将表之间的操作连接起来

1>一对多

正向查找

from django.db import models
# Create your models here. class UserType(models.Model):
nid = models.AutoField(primary_key=True)
caption = models.CharField(max_length=16) class UserInfo(models.Model):
user = models.CharField(max_length=32)
email = models.EmailField(max_length=32)
pwd = models.CharField(max_length=64)
user_type = models.ForeignKey(UserType)

表结构实例

#不在filter()或values()中查询使用
ret = models.UserInfo.objects.all()
for i in ret :
print(type(i),i.user,i.user_type.caption)
#得到的ret是一个queryset对象,只有我们循环我们得到每一行的一个对象的时候才可以用.字段名获取数据
# 想获取和其有联系表的数据的时候,i.user_type得到的是一个有联系表的对象,我们就可以获取数据了
#在filter()或values()中查询使用
ret1 = models.UserInfo.objects.filter(user_type__caption='管理员').all().values('user','user_type__caption')
ret2 = models.UserInfo.objects.all().values('user','user_type__caption') print(type(ret1),ret1)
print(type(ret2),ret2)
#我们查的是userinfo表中的user,所以应该user中数据全部显示,而'user_type__caption'即另一张表中的数据根据user对应的值进行显示

 反向查找

1、不在filter()或values()中查询使用

ret = models.UserInfo.objects.all()
for i in ret :
print(type(i.user_type),i.user_type) ret1 = models.UserType.objects.all()
for j in ret1:
print(type(j.userinfo_set),j.userinfo_set) ------------------------------------------------------------------------------------------------------------------------------------------------------
<class 'app1.models.UserType'> UserType object
<class 'app1.models.UserType'> UserType object
<class 'app1.models.UserType'> UserType object <class 'django.db.models.fields.related_descriptors.create_reverse_many_to_one_manager.<locals>.RelatedManager'> app1.UserInfo.None
<class 'django.db.models.fields.related_descriptors.create_reverse_many_to_one_manager.<locals>.RelatedManager'> app1.UserInfo.None
<class 'django.db.models.fields.related_descriptors.create_reverse_many_to_one_manager.<locals>.RelatedManager'> app1.UserInfo.None ------------------------------------------------------------------------------------------------------------------------------------------------------
1、以上我们可以看出有外键的类中存在user_type字段,可以通过这个字段就能得到和其对应表的对象,从而获取另一张表中的信息
2、而不存在外键的表中其实隐藏了一个userinfo_set字段,我们同样可以通过这个字段获取其对应表中的信息------->对应表表名_set

2、在filter()或values()中查询使用

ret1 = models.UserType.objects.all().values('caption','userinfo')
ret2 = models.UserType.objects.all().values('caption','userinfo__user')
print(ret1)
print(ret2)
#如果反向查找的条件放到filter()或values()中的时候就不能用表名_set了,而用 ------>表名__

2>多对多

创建表的三种方式:

第三张表中自动生成联合唯一索引

1、自己创建第三张表(适用于我们在第三张表中自定义列)

class Host_To_Group(models.Model):
hg_id =models.AutoField(primary_key=True)
host_id = models.ForeignKey('Host') #当关系表在下面的时候,这里我们需要加引号引起来
group_id = models.ForeignKey('Group') class Host(models.Model):
hid = models.AutoField(primary_key=True)
hostname = models.CharField(max_length=32)
ip = models.CharField(max_length=32) class Group(models.Model):
gid = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)

自己创建

2、利用ManyToManyField()

class Host(models.Model):
hid = models.AutoField(primary_key=True)
hostname = models.CharField(max_length=32)
ip = models.CharField(max_length=32) class Group(models.Model):
gid = models.AutoField(primary_key=True)
name = models.CharField(max_length=32) h2g = models.ManyToManyField(Host) #不会生成新的一列,而是帮我们生成第三张表

ManyToMany

3、自己创第三种表+ManyToManyField()-----虽然这样看起来后面的在创建数据库的时候没用,但是其在操作数据库的时候有用

中间模型表如果是通过through制定的,add create方法会失效 

class Host_To_Group(models.Model):
hg_id =models.AutoField(primary_key=True)
host_id = models.ForeignKey('Host')
group_id = models.ForeignKey('Group') class Host(models.Model):
hid = models.AutoField(primary_key=True)
hostname = models.CharField(max_length=32)
ip = models.CharField(max_length=32) class Group(models.Model):
gid = models.AutoField(primary_key=True)
name = models.CharField(max_length=32) h2g = models.ManyToManyField('Host',through='Host_To_Group') #这里的through在操作数据库的时候有用

自己创建+ManyToManyField(through='xxx')

 
g1 = models.Group.objects.get(gid=1)
h1 = models.Host.objects.get(hid=1)
h2 = models.Host.objects.filter(hid__gt=1)
# 正向添加数据
g1.h2g.add(h1)
g1.h2g.add(*h2) h1 = models.Host.objects.get(hid=1)
g1 = models.Group.objects.get(gid=2)
g2 = models.Group.objects.filter(gid__gt=2)
# 反向添加数据
h1.group_set.add(g1)
h1.group_set.add(*g2) g1 = models.Group.objects.get(gid=1)
h1 = models.Host.objects.get(hid=1)
h2 = models.Host.objects.filter(hid__gt=1)
# 正向删除数据
g1.h2g.remove(h1)
g1.h2g.remove(*h2) h1 = models.Host.objects.get(hid=1)
g1 = models.Group.objects.get(gid=2)
g2 = models.Group.objects.filter(gid__gt=2)
#反向删除数据
h1.group_set.remove(g1)
h1.group_set.remove(*g2) #正向查数据
h1 = models.Host.objects.get(hid=2)
print(h1.group_set) #反向查数据
g1 = models.Group.objects.get(gid=2)
print(g1.h2g)

多对多之增删改查

慎用:h1.group_set.all().delete()------------同时删除关系表和关联表中数据

----------------------------------------------------重点-----------------------------------------------

以上如果我们利用第三种方法建立表的时候,add、set等方法会失效,不能操作,只能查看

and和or

其中F表示可以让某一列的数据在当前的状态下自增多少,而我们平时用的updata只能把某一列数据都改变成同一个值

其中Q表示搜索条件可以有or和and

# F 使用查询条件的值
#
# from django.db.models import F
# models.Tb1.objects.update(num=F('num')+1) # Q 构建搜索条件
from django.db.models import Q
# con = Q()
#
# q1 = Q()
# q1.connector = 'OR'
# q1.children.append(('id', 1))
# q1.children.append(('id', 10))
# q1.children.append(('id', 9))
#
# q2 = Q()
# q2.connector = 'OR'
# q2.children.append(('c1', 1))
# q2.children.append(('c1', 10))
# q2.children.append(('c1', 9))
#
# con.add(q1, 'AND')
# con.add(q2, 'AND')
#
# models.Tb1.objects.filter(con) #
# from django.db import connection
# cursor = connection.cursor()
# cursor.execute("""SELECT * from tb where name = %s""", ['Lennon'])
# row = cursor.fetchone()

Django中级篇之Model专题的更多相关文章

  1. Django中级篇(下)

    中间件 django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法. MIDDLEWA ...

  2. Django(进阶篇)之model

    Model 解析 Django的数据库,涉及相关操作时就是以下流程: 1.创建数据库,设计表结构和字段 2.使用Mysqldb来连接数据库,并编写数据访问层 3.业务逻辑层去调用数据访问层执行数据库操 ...

  3. Django中级篇之模板语言

    模板 一.引用变量 模版的创建过程,对于模版,其实就是读取模版(其中嵌套着模版标签),然后将 Model 中获取的数据插入到模版中,最后将信息返回给用户. {{ xxx }} 二.标签 用{%  %} ...

  4. Django中级篇(上)

    Form验证 django中的Form一般有两种功能: 输入html-----------不能你自己写一些标签,而帮你自动生成 验证用户输入-------将用户验证信息保存起来,可以传到前段 #!/u ...

  5. Django总结篇

    1.0 简述http协议和常用请求头 http协议: ( 基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)) HTTP协议是Hyper Text Transfer Pro ...

  6. django-url调度器-中级篇

    在初级篇中,我们接触了: 1.url 的简单编写 2.两种传参的方式 3.捕获的参数总是字符串 4.为视图设置默认参数 …… 在中级篇中将更进一步. 包含其它的URLconfs 当网站非常大的时候,将 ...

  7. Django之--MVC的Model

    在上一篇:Django之--通过MVC架构的html模板展示Hello World! 讲述了基本的MVC模型,但是却并没有测试Model的作用,本文通过mysql数据库来测试. Django自带的mo ...

  8. Java工程师学习指南 中级篇

    Java工程师学习指南 中级篇 最近有很多小伙伴来问我,Java小白如何入门,如何安排学习路线,每一步应该怎么走比较好.原本我以为之前的几篇文章已经可以解决大家的问题了,其实不然,因为我写的文章都是站 ...

  9. 02:Django进阶篇

    目录:Django其他篇 01:Django基础篇 02:Django进阶篇 03:Django数据库操作--->Model 04: Form 验证用户数据 & 生成html 05:Mo ...

随机推荐

  1. Maven修改镜像仓库地址

    修改maven根目录下的conf文件夹中的setting.xml文件,如果你修改了默认仓库的存储位置,即.m2文件夹下没有本地仓库,但是有个setting.xml文件,那就修改这个文件就可以. 具体内 ...

  2. Redis集群方案介绍

    由于Redis出众的性能,其在众多的移动互联网企业中得到广泛的应用.Redis在3.0版本前只支持单实例模式,虽然现在的服务器内存可以到100GB.200GB的规模,但是单实例模式限制了Redis没法 ...

  3. ulipad 常用快捷键

    快捷键名称 对应功能 F1 (M)UliPad Help Document(帮助文档) F2 (M)Directory Browser(目录浏览)(3.1版新增) F3 (M)Find Next(查找 ...

  4. Source insight 3572版本安装及An invalid source insight serial number was detected解决方法

    Source insight有最新版3572.3.50.0076 下载连接:http://www.sourceinsight.com/down35.html,   http://www.sourcei ...

  5. c++常用的一些库函数、常量和头文件

    1.常用数学函数 头文件 #include <math> 或者 #include <math.h>   函数原型 功能 返回值 int abs(int x) 求整数x的绝对值 ...

  6. Spark RDD简介与运行机制概述

    RDD工作原理: 主要分为三部分:创建RDD对象,DAG调度器创建执行计划,Task调度器分配任务并调度Worker开始运行. SparkContext(RDD相关操作)→通过(提交作业)→(遍历RD ...

  7. Python分布式爬虫原理

    转载 permike 原文 Python分布式爬虫原理 首先,我们先来看看,如果是人正常的行为,是如何获取网页内容的. (1)打开浏览器,输入URL,打开源网页 (2)选取我们想要的内容,包括标题,作 ...

  8. [物理学与PDEs]书中的错误指出

    记号意义: P--Page, 第几页; L--Line, 顺数第几行; LL--Last Line, 倒数第几行. P 64 L 1 ``15)'' should be ``14)''. P 70 L ...

  9. 创建一个spring helloworld

    1.下载所需要的jar包 http://projects.spring.io/spring-framework/ 这里使用了maven方式给出jar <dependencies> < ...

  10. [ActionScript 3.0] AS3 绘制12面体

    package { import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; im ...