一、WSGI接口

WSGI服务网关接口:Web Server Gateway Interface缩写。

WSGI是python定义的Web服务器和Web应用程序之间或框架之间的通用接口标准。

WSGI定义:Web开发者实现了一个函数,并响应HTTP请求。

WSGI将Web组件分成三类:Web服务器(WSGI Server),Web中间件(WSGI Middleware),Web用用程序(WSGI Application).

Web服务器接收HTTP请求,调用WSGI接口标准注册的WSGI Application,最后将响应返回给客户端。

Web应用的本质:1.浏览器发送HTTP请求。

2.服务器接收请求,生成HTML页面。

3.服务器将HTML页面当成HTTP响应的body发送给浏览器。

4.浏览器接收到HTTP响应,并从HTTP Body中HTML并渲染出来

二、中间件

django的中间件(Middleware),其实就是一个类,在请求前和请求后,django会根据自己的规则并在合适的时机执行中间件中相应的方法。

中间件的官方说法是中间件是一个用来处理django的请求和相应的框架级别的钩子。在全局范围内改变django的输入和输出,每个中间件都有特定的功能。

中间件可以定义五个方法:1.process_request(self, request)

2.process_response(self, request, response)

3.process_view(self, request, view_func, view_args, view_kwargs)

4.process_exception(self, request, exception)

5.process_template_response(self, request, response)

以上方法返回的可以是None也可以是HttpResponse对象,如果是None,这继续按照django的规则继续执行下面的中间件,如果是HttpResponse对象,则直接把对象返回给用户。

process_request

process_request有一个参数,就是request,这个request和视图函数中的request是一样的。它的返回值可以是None也可以是HttpResponse对象。返回值是None的话,按正常流程继续走,交给下一个中间件处理,如果是HttpResponse对象,Django将不执行视图函数,而是直接走本中间件的process_response方法,倒序返回,将相应对象返回给浏览器。

  1. 中间件的process_request方法是在执行视图函数之前执行的。
  2. 当配置多个中间件时,会按照MIDDLEWARE中的注册顺序,也就是列表的索引值,从前到后依次执行的。
  3. 不同中间件之间传递的request都是同一个对象

process_response

process_response有两个参数,一个是request,一个是response。这里面的request和process_request里面的参数request是一样的对象,response是视图函数返给回给用户的是Httpresponse对象,并且该方法返回值必须是HttpResponse对象。

  1. 中间件的process_response方法是在执行视图函数之后执行的。
  2. 当配置多个中间件时,会按照MIddleware注册顺序的倒序执行,从后往前执行。

process_view

process_view有四个参数:1.request是HttpResponse对象

             2.view_func是django即将用到的视图函数,它是实际的视图函数

3.view_args是传递给视图函数的位置参数的列表

4.view_kwargs是传递给视图函数的关键之参数的字典

5.args和kwargs都不包含第一个参数request

  1. 中间件的process_view方法是在执行视图函数之前执行的。
  2. process_view方法是在所有的process_request方法执行完之后执行的
  3. 当配置多个中间件时,会按照Middleware的注册顺序从前往后执行

process_view它应该返回一个None或HttpResponse对象,如果返回None,则继续执行剩下的中间件的process_view方法,然后再执行相应的视图。如果返回HttpResponse对象,则不再执行剩下的process_view和后面的视图函数,它将执行中间件的process_response方法并将应用到HttpResponse并返回结果。

process_exception

process_exception有两个参数:request是一个HttpResponse对象,exception是视图产生的Exception对象。这个方法是只有视图函数执行异常时才执行的,它返回的对象可以是一个None也可以是一个HttpResponse对象。如果是HttpResponse对象,django将调用模板和process_response方法并返回给浏览器。,否则默认处理异常。

  1. 如果视图函数中无异常,process_exception方法则不执行。
  2. 当配置多个中间件时,会按照Middleware的注册顺序从后往前执行
  3. 当一个中间的process_exception方法执行了,则直接调用process_response方法,不再执行其他中间件的process_exception方法

process_template_response

它有两个参数,request参数是HttpResponse对象,response参数是TemplateResponse对象(由视图函数或中间件产生)。

  1. process_template_response方法是在视图函数之后立即执行
  2. 但是它由一个前提条件,就是视图函数返回的对象有一个render()(或则表明表明该对象是一个TemplateResponse对象或等价方法)
  3. 当配置多个中间件时,会按照Middleware的注册顺序从后往前执行
  4. 然后执行视图函数返回的HttpResponse对戏那个的render()方法,并返回一个新的HttpResponse对象
  5. 然后执行process_response方法

三、URL路由系统(URLconf)

URL配置(URLconf)就像django所支撑网站的目录,它的本质就是该URL和要为该URL调用的视图函数之间的映射表。

  1. # 基本配置
    from djago.conf.urls import url
  2.  
  3. urlpattrens = [
    url(正则表达式,views视图函数名,参数,别名),
    ]
  1. # 注意事项
    1.从上到下一次匹配,一旦匹配成功就不再匹配
    2.不需要添加一个前导的斜杠,因为每个URL都有
    3.每个正则表达式前的r是可选的,但建议加上
  1. # 补充说明
    APPEEND_SLASH = True # django默认为True,作用就是自动在网址末尾加/
  1. URLconf不检验请求方法,同一个URL不论什么请求方式,都走同一个视图函数。
  2. 捕捉到的参数永远都是字符串
  1. # 起别名
  2. url(r'^home', views.home, name='home'), # 给我的url匹配模式起名为 home
  3. url(r'^index/(\d*)', views.index, name='index'), # 给我的url匹配模式起名为index

这样:

在模板里面可以这样引用:

  1. {% url 'home' %}

在views函数中可以这样引用:

  1. from django.urls import reverse
  2.  
  3. reverse("index", args=("2018", ))

命名空间模式

即使不同的APP使用相同的URL名称,URL的命名空间模式也可以让你唯一反转命名的URL。

举个例子:

project中的urls.py

  1. from django.conf.urls import url, include
  2.  
  3. urlpatterns = [
  4. url(r'^app01/', include('app01.urls', namespace='app01')),
  5. url(r'^app02/', include('app02.urls', namespace='app02')),
  6. ]

app01中的urls.py

  1. from django.conf.urls import url
  2. from app01 import views
  3.  
  4. app_name = 'app01'
  5. urlpatterns = [
  6. url(r'^(?P<pk>\d+)/$', views.detail, name='detail')
  7. ]

app02中的urls.py

  1. from django.conf.urls import url
  2. from app02 import views
  3.  
  4. app_name = 'app02'
  5. urlpatterns = [
  6. url(r'^(?P<pk>\d+)/$', views.detail, name='detail')
  7. ]

现在,我的两个app中 url名称重复了,我反转URL的时候就可以通过命名空间的名称得到我当前的URL。

语法:

'命名空间名称:URL名称'

模板中使用:

  1. {% url 'app01:detail' pk=12 pp=99 %}

views中的函数中使用

  1. v = reverse('app01:detail', kwargs={'pk':11})

这样即使app中URL的命名相同,我也可以反转得到正确的URL了。

有名分组

  1. # 这种形式是无名分组
    from django.conf.urls import url
  2.  
  3. from . import views
  4.  
  5. urlpatterns = [
  6. url(r'^articles/2003/$', views.special_case_2003),
  7. url(r'^articles/([0-9]{4})/$', views.year_archive),
  8. url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
  9. url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
  10. ]

没有命名的正则表达式组(通过圆括号)来捕获URL中的值并以位置参数传递给视图。在更高级的用法中,可以使用命名的正则表达式组来捕获URL 中的值并以关键字 参数传递给视图。

在Python 正则表达式中,命名正则表达式组的语法是(?P<name>pattern),其中name 是组的名称,pattern 是要匹配的模式。

  1. from django.conf.urls import url
  2.  
  3. from . import views
  4.  
  5. urlpatterns = [
  6. url(r'^articles/2003/$', views.special_case_2003),
  7. url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
  8. url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
  9. url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail),
  10. ]

这个实现与无名分组完全相同,只有一个细微的差别:捕获的值作为关键字参数而不是位置参数传递给视图函数。例如:

  1. /articles/2005/03/
  2. 请求将调用views.month_archive(request, year='', month='')函数
  3. /articles/2003/03/03/
  4. 请求将调用函数views.article_detail(request, year='', month='', day='')。

四、Template模板

python的模板:HTML代码+逻辑控制代码

  1. # 变量 用双大括号来引用变量 用法:{{ title }}
  1. # 逻辑 用大括号和百分号组合 用法:{% for user in user_list %} {% endfor %}
  1. # 点 . 在模板里面有特殊的含义,就是获取对象的相应属性值 {{ user.name }}
  1. # 模板中支持的写法
    {# l中的第一个参数 #}
  2. {{ l.0 }}
  3. {# 取字典中key的值 #}
  4. {{ d.name }}
  5. {# 取对象的name属性 #}
  6. {{ person_list.0.name }}
  7. {# .操作只能调用不带参数的方法 #}
  8. {{ person_list.0.dream }}

Filters过滤器的使用

  1. 语法: {{ value|filter_name:参数 }}
    {{ value|default:"nothing" }}
    {{ value|length }} # 返回value的长度
    {{ value|filesizeformat }} # 将十进制数转为为KB,MB,GB等
    {{ value|slice:"2:-1" }} # 切片
    {{ value|data:"Y-m-d H:i:s" }} # 格式化时间
    {{ value|safa }} # 告诉django这段代码是安全的,不必转译
    {{ value|truncatechars:9 }} # 截断,如果value的字符数大于9,则只显示前9个字符,后面的用...表示。
    {{ value|upper }} # 将value的字母全变成大写
    {{ value|add:2 }} # value值+2并显示
    {{ value|cut:"a" }} # 移除指定字符

自定义filter过滤器

  1. from django import template
    register = template.Library()
  2.  
  3. @register.filter(name="cut")
    def cut(value, args):
    return value.replace(args, "")
  4.  
  5. @register.filter(name="add")
    def add(value):
    return "{}很可爱!".format(value)
  1. {# 先导入我们自定义filter那个文件 #}
  2. {% load app01_filters %}
  3.  
  4. {# 使用我们自定义的filter #}
  5. {{ somevariable|cut:"" }}
  6. {{ value|add }}

注意:以上代码要在django项目中使用

前端未完待续......

五、Views视图

django的两种处理请求的方式:FBV和CBV

FBV:function base views  在视图里面基于函数处理请求

CBV:class base views  在视图里面基于类处理请求

  1. # urls.py中
  2. url(r'^add_class/$', views.AddClass.as_view()),

Response对象

HttpResponse类位于django.http模块中。

使用

传递字符串

  1. from django.http import HttpResponse
  2. response = HttpResponse("Here's the text of the Web page.")
  3. response = HttpResponse("Text only, please.", content_type="text/plain")

设置或删除响应头信息

  1. response = HttpResponse()
  2. response['Content-Type'] = 'text/html; charset=UTF-8'
  3. del response['Content-Type']

属性

HttpResponse.content:响应内容

HttpResponse.charset:响应内容的编码

HttpResponse.status_code:响应的状态码

JsonResponse对象

JsonResponse是HttpResponse的子类,专门用来生成JSON编码的响应。

  1. from django.http import JsonResponse
  2.  
  3. response = JsonResponse({'foo': 'bar'})
  4. print(response.content)
  5.  
  6. b'{"foo": "bar"}'

默认只能传递字典类型,如果要传递非字典类型需要设置一下safe关键字参数。

  1. response = JsonResponse([1, 2, 3], safe=False)

render()

结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象。

  1. from django.shortcuts import render
  2.  
  3. def my_view(request):
  4. # 视图的代码写在这里
  5. return render(request, 'myapp/index.html', {'foo': 'bar'})

redirect()

参数可以是:

  • 一个模型:将调用模型的get_absolute_url() 函数
  • 一个视图,可以带有参数:将使用urlresolvers.reverse 来反向解析名称
  • 一个绝对的或相对的URL,将原封不动的作为重定向的位置。

默认返回一个临时的重定向;传递permanent=True 可以返回一个永久的重定向。

示例:

你可以用多种方式使用redirect() 函数。

传递一个具体的ORM对象(了解即可)

将调用具体ORM对象的get_absolute_url() 方法来获取重定向的URL:

  1. from django.shortcuts import redirect
  2.  
  3. def my_view(request):
  4. ...
  5. object = MyModel.objects.get(...)
  6. return redirect(object)

传递一个视图的名称

  1. def my_view(request):
  2. ...
  3. return redirect('some-view-name', foo='bar')

传递要重定向到的一个具体的网址

  1. def my_view(request):
  2. ...
  3. return redirect('/some/url/')

当然也可以是一个完整的网址

  1. def my_view(request):
  2. ...
  3. return redirect('http://example.com/')

默认情况下,redirect() 返回一个临时重定向。以上所有的形式都接收一个permanent 参数;如果设置为True,将返回一个永久的重定向:

  1. def my_view(request):
  2. ...
  3. object = MyModel.objects.get(...)
  4. return redirect(object, permanent=True)  

扩展阅读:

临时重定向(响应状态码:302)和永久重定向(响应状态码:301)对普通用户来说是没什么区别的,它主要面向的是搜索引擎的机器人。

A页面临时重定向到B页面,那搜索引擎收录的就是A页面。

A页面永久重定向到B页面,那搜索引擎收录的就是B页面。

6.2、操作表

基本操作

  1. # 增
  2. #
  3. # models.Tb1.objects.create(c1='xx', c2='oo') 增加一条数据,可以接受字典类型数据 **kwargs
  4.  
  5. # obj = models.Tb1(c1='xx', c2='oo')
  6. # obj.save()
  7.  
  8. # 查
  9. #
  10. # models.Tb1.objects.get(id=123) # 获取单条数据,不存在则报错(不建议)
  11. # models.Tb1.objects.all() # 获取全部
  12. # models.Tb1.objects.filter(name='seven') # 获取指定条件的数据
  13.  
  14. # 删
  15. #
  16. # models.Tb1.objects.filter(name='seven').delete() # 删除指定条件的数据
  17.  
  18. # 改
  19. # models.Tb1.objects.filter(name='seven').update(gender='0') # 将指定条件的数据更新,均支持 **kwargs
  20. # obj = models.Tb1.objects.get(id=1)
  21. # obj.c1 = '111'
  22. # obj.save() # 修改单条数据
  23. # save是更改所有字段,即使更改一个字段,也会将所有字段重新赋值, 不推荐
  24. # update更改,只更改修改的字段,推荐使用
  25.  
  26. # update方式修改不能用get的原因是:update是QuerySet对象的方法,get返回的是一个model对象,它没有update方法,而filter返回的是一个QuerySet对象(filter里面的条件可能有多个条件符合,比如name='alvin',可能有两个name='alvin'的行数据)
  27.  
  28. 基本操作

基本操作

查询相关API

  1. # 查询相关API:
  2.  
  3. # <1>filter(**kwargs): 它包含了与所给筛选条件相匹配的对象
  4.  
  5. # <2>all(): 查询所有结果
  6.  
  7. # <3>get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。
  8.  
  9. #-----------下面的方法都是对查询的结果再进行处理:比如 objects.filter.values()--------
  10.  
  11. # <4>values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列 model的实例化对象,而是一个可迭代的字典序列
  12.  
  13. # <5>exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象
  14.  
  15. # <6>order_by(*field): 对查询结果排序
  16.  
  17. # <7>reverse(): 对查询结果反向排序
  18.  
  19. # <8>distinct(): 从返回结果中剔除重复纪录
  20.  
  21. # <9>values_list(*field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
  22.  
  23. # <10>count(): 返回数据库中匹配查询(QuerySet)的对象数量。
  24.  
  25. # <11>first(): 返回第一条记录
  26.  
  27. # <12>last(): 返回最后一条记录
  28.  
  29. # <13>exists(): 如果QuerySet包含数据,就返回True,否则返回False
  30.  
  31. 查询相关API

查询API

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

  1. # 获取个数
  2. #
  3. # models.Tb1.objects.filter(name='seven').count()
  4.  
  5. # 大于,小于
  6. #
  7. # models.Tb1.objects.filter(id__gt=1) # 获取id大于1的值
  8. # models.Tb1.objects.filter(id__gte=1) # 获取id大于等于1的值
  9. # models.Tb1.objects.filter(id__lt=10) # 获取id小于10的值
  10. # models.Tb1.objects.filter(id__lte=10) # 获取id小于10的值
  11. # models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值
  12.  
  13. # in
  14. #
  15. # models.Tb1.objects.filter(id__in=[11, 22, 33]) # 获取id等于11、22、33的数据
  16. # models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in
  17.  
  18. # isnull
  19. # Entry.objects.filter(pub_date__isnull=True)
  20.  
  21. # contains
  22. #
  23. # models.Tb1.objects.filter(name__contains="ven")
  24. # models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感
  25. # models.Tb1.objects.exclude(name__icontains="ven")
  26.  
  27. # range
  28. #
  29. # models.Tb1.objects.filter(id__range=[1, 2]) # 范围bettwen and
  30.  
  31. # 其他类似
  32. #
  33. # startswith,istartswith, endswith, iendswith,
  34.  
  35. # order by
  36. #
  37. # models.Tb1.objects.filter(name='seven').order_by('id') # asc
  38. # models.Tb1.objects.filter(name='seven').order_by('-id') # desc
  39.  
  40. # group by
  41. #
  42. # from django.db.models import Count, Min, Max, Sum
  43. # models.Tb1.objects.filter(c1=1).values('id').annotate(c=Count('num'))
  44. # SELECT "app01_tb1"."id", COUNT("app01_tb1"."num") AS "c" FROM "app01_tb1" WHERE "app01_tb1"."c1" = 1 GROUP BY "app01_tb1"."id"
  45.  
  46. # limit 、offset
  47. #
  48. # models.Tb1.objects.all()[10:20]
  49.  
  50. # regex正则匹配,iregex 不区分大小写
  51. #
  52. # Entry.objects.get(title__regex=r'^(An?|The) +')
  53. # Entry.objects.get(title__iregex=r'^(an?|the) +')
  54.  
  55. # date
  56. #
  57. # Entry.objects.filter(pub_date__date=datetime.date(2005, 1, 1))
  58. # Entry.objects.filter(pub_date__date__gt=datetime.date(2005, 1, 1))
  59.  
  60. # year
  61. #
  62. # Entry.objects.filter(pub_date__year=2005)
  63. # Entry.objects.filter(pub_date__year__gte=2005)
  64.  
  65. # month
  66. #
  67. # Entry.objects.filter(pub_date__month=12)
  68. # Entry.objects.filter(pub_date__month__gte=6)
  69.  
  70. # day
  71. #
  72. # Entry.objects.filter(pub_date__day=3)
  73. # Entry.objects.filter(pub_date__day__gte=3)
  74.  
  75. # week_day
  76. #
  77. # Entry.objects.filter(pub_date__week_day=2)
  78. # Entry.objects.filter(pub_date__week_day__gte=2)
  79.  
  80. # hour
  81. #
  82. # Event.objects.filter(timestamp__hour=23)
  83. # Event.objects.filter(time__hour=5)
  84. # Event.objects.filter(timestamp__hour__gte=12)
  85.  
  86. # minute
  87. #
  88. # Event.objects.filter(timestamp__minute=29)
  89. # Event.objects.filter(time__minute=46)
  90. # Event.objects.filter(timestamp__minute__gte=29)
  91.  
  92. # second
  93. #
  94. # Event.objects.filter(timestamp__second=31)
  95. # Event.objects.filter(time__second=2)
  96. # Event.objects.filter(timestamp__second__gte=31)
  97.  
  98. 进阶操作

双下方法

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

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

  1. class UserProfile(models.Model):
  2. user_info = models.OneToOneField('UserInfo')
  3. username = models.CharField(max_length=64)
  4. password = models.CharField(max_length=64)
  5.  
  6. def __unicode__(self):
  7. return self.username
  8.  
  9. class UserInfo(models.Model):
  10. user_type_choice = (
  11. (0, u'普通用户'),
  12. (1, u'高级用户'),
  13. )
  14. user_type = models.IntegerField(choices=user_type_choice)
  15. name = models.CharField(max_length=32)
  16. email = models.CharField(max_length=32)
  17. address = models.CharField(max_length=128)
  18.  
  19. def __unicode__(self):
  20. return self.name
  21.  
  22. class UserGroup(models.Model):
  23.  
  24. caption = models.CharField(max_length=64)
  25.  
  26. user_info = models.ManyToManyField('UserInfo')
  27.  
  28. def __unicode__(self):
  29. return self.caption
  30.  
  31. class Host(models.Model):
  32. hostname = models.CharField(max_length=64)
  33. ip = models.GenericIPAddressField()
  34. user_group = models.ForeignKey('UserGroup')
  35.  
  36. def __unicode__(self):
  37. return self.hostname
  38.  
  39. 表结构实例

表结构

  1. user_info_obj = models.UserInfo.objects.filter(id=1).first()
  2. print(user_info_obj.user_type)
  3. print(user_info_obj.get_user_type_display())
  4. print(user_info_obj.userprofile.password)
  5.  
  6. user_info_obj = models.UserInfo.objects.filter(id=1).values('email', 'userprofile__username').first()
  7. print(user_info_obj.keys())
  8. print(user_info_obj.values())

OneToOne

Django框架详解的更多相关文章

  1. Django框架详解之url

    Django基本命令 下载Django pip3 install django 创建一个django project django-admin.py startproject cms 当前目录下会生成 ...

  2. Django框架详解之template

    模板简介 将页面的设计和python的代码分离开会更干净简洁更容易维护.我们可以使用Django的模板系统来实现这种模式 python的模板:HTML代码+模板语法 模板包括在使用时会被值替换掉的变量 ...

  3. Django框架详解之views

    一个简单的视图 一个视图函数,是一个简单的python函数,它接受web请求并且返回web响应.无论视图本身包含什么逻辑,都要返回响应.为了将代码放在某处,约定是将视图放置在项目或应用程序目录中的名为 ...

  4. Django 2.0 学习(20):Django 中间件详解

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

  5. jQuery Validate验证框架详解

    转自:http://www.cnblogs.com/linjiqin/p/3431835.html jQuery校验官网地址:http://bassistance.de/jquery-plugins/ ...

  6. mina框架详解

     转:http://blog.csdn.net/w13770269691/article/details/8614584 mina框架详解 分类: web2013-02-26 17:13 12651人 ...

  7. lombok+slf4j+logback SLF4J和Logback日志框架详解

    maven 包依赖 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lomb ...

  8. [Cocoa]深入浅出 Cocoa 之 Core Data(1)- 框架详解

    Core data 是 Cocoa 中处理数据,绑定数据的关键特性,其重要性不言而喻,但也比较复杂.Core Data 相关的类比较多,初学者往往不太容易弄懂.计划用三个教程来讲解这一部分: 框架详解 ...

  9. iOS 开发之照片框架详解(2)

    一. 概况 本文接着 iOS 开发之照片框架详解,侧重介绍在前文中简单介绍过的 PhotoKit 及其与 ALAssetLibrary 的差异,以及如何基于 PhotoKit 与 AlAssetLib ...

随机推荐

  1. 使用别名访问MSSQL Express

    当MSSQL Express安装成功后,默认只能用 .\sqlexpress 或者 (local)\sqlexpress 有时候我们希望使用(local) 就可以访问,此时就可以利用别名 1.MSSQ ...

  2. Go语言之高级篇beego框架之model设计构造查询

    一.model设计构造查询 QueryBuilder 提供了一个简便,流畅的 SQL 查询构造器.在不影响代码可读性的前提下用来快速的建立 SQL 语句. QueryBuilder 在功能上与 ORM ...

  3. 生成springboot docker镜像 并上传到阿里云镜像厂库

    1 mvn package 2 创建Dockerfile ----------------------------------------------------------------------- ...

  4. MDX Cookbook 04 - 在集合中实现 NOT IN 逻辑 (Minus, Except, Filter 等符号和函数的使用)

    有时需要从一些查询结果里排除掉一些成员,当然平常情况下可以通过 MDX 查询中的 WHERE 条件即 Slicer 切片来完成,同样的这里显示的是如何在切片中排除掉一些成员. 先看这一个查询 - , ...

  5. puppet应用案例

  6. SpringCloud分布式事务TCC实现

    可以参考 http://www.txlcn.org/ 的实现方式

  7. Wifiner for Mac(WiFi 状况分析工具)破解版安装

    1.软件简介    Wifiner 是 macOS 系统上一款 Wifi 分析工具,仅需几次点击即可对您的 Wi-Fi 网络连接进行分析和故障排除.扫描您的 Wi-Fi 网络,获取包含交互式彩色编码热 ...

  8. 【C语言】数组名传递给函数,数组的sizeof变为4的原因

    C语言中,数组名作为参数传递给函数时,退化为指针,sizeof对指针操作结果应该是4.例子如下: #include<iostream> using namespace std; void ...

  9. 深入理解Fsync

    1 介绍 数据库系统从诞生那天开始,就面对一个很棘手的问题,fsync的性能问题.组提交(group commit)就是为了解决fsync的问题.最近,遇到一个业务反映MySQL创建分区表很慢,仔细分 ...

  10. lua -- 物品的配置文件,表的形式保存

    do local goodsprop= { RECORDS={ []={ BuyGold= , RecoverPrice= , Value= , Param2= , UseTimesPerDay= , ...