Mysql 外键 Foreign Key

昨晚被朋友问到一个有关mysql外键的问题,问我删除外键再重新创建另一张表的外键,会提示key值重复,一下子问懵了,
潜意识告诉我不应该,但是自己做了一下操作确实如此,最后发现是建立了索引的缘故。故,在此记录一下,写一下关于我的理解。
既然做记录,这边就简述一下外键:

  • 如果一张表中有一个非主键的字段指向了别一张表中的主键,就将该字段叫做外键。
  • 1.对子表(外键所在的表)的作用:子表在进行写操作的时候,如果外键字段在父表中找不到对应的匹配,操作就会失败。
  • 2.对父表的作用:对父表的主键字段进行删和改时,如果对应的主键在子表中被引用,操作就会失败。
  • 外键的定制作用:
    => district:严格模式(默认), 父表不能删除或更新一个被子表引用的记录。
    => cascade:级联模式, 父表操作后,子表关联的数据也跟着一起操作。
    => set null:置空模式,前提外键字段允许为NLL, 父表操作后,子表对应的字段被置空。
  • 使用外键的前提:
    => 表储存引擎必须是innodb,否则创建的外键无约束效果。
    => 外键的列类型必须与父表的主键类型完全一致。
    => 外键的名字不能重复。
    => 已经存在数据的字段被设为外键时,必须保证字段中的数据与父表的主键数据对应起来。

其实在现在的并发系统中,因为限制的原因,采用外键的机会个人觉得不会很多.(笔者参与的几个项目均未采用外键)
接下来,我们做一个验证:

Read More

Requests对摘要认证的处理

许多 web 服务都需要身份认证,并且也有多种不同的认证类型。
下面笔者着重说一下摘要认证以及python包Requests对摘要认证的处理。
首先,Requests对摘要认证其实是开箱即用的。
如下:

1
2
3
from requests.auth import HTTPDigestAuth
url = 'http://digest.cereson.cn/auth/index.php'
requests.get(url, auth=HTTPDigestAuth('user', 'passwd'))

接下来说一下什么是摘要认证:
首先摘要认证被设计用来弥补基本认证的缺点。
摘要认证基于请求-响应(challenge-response)模式,
而且使用了哈希加密算法(常用为MD5),从而某些程度上解决了基本认证安全性的问题。
服务器返回的初始401响应的www认证头(WWW-Authenticate header)中多出了一个称为nonce的随机数的字段。
服务端保证每个401响应中的nonce值唯一。如:
Authorization: Digest username="admin", realm="HiPER"

接下来的客户端响应中将包含由用户名、密码、nonce和其他信息组成的数据的哈希值(如使用MD5加密)。
所有被加密的数据服务端也具有,因此服务端执行同样加密过程。如果二者一致则认证成功。
因为如MD5等哈希加密算法是不可逆的,因此用户名密码明文无法被窃听破解。
因为服务器对同一个nonce的请求只接受一次客户端请求,从而能避免重放攻击。
但是,digest的安全性也有缺点:

  • 只有密码密码被加密,而客户端最终请求的被保护资源是明文传送的,可被窃听
  • 客户端无法确认服务端的正确身份,缺少对服务端的认证方式
  • 近年来,随着计算机性能的提高等因素,传统高强度加密算法的破解已成可能。而MD5更是已有破解方法。

    Read More

如何在Python里使用FTP

Python作为一款集包大成的语言,自然必不可少ftplib,而ftplib模块就定义了FTP类用于上传或下载文件。

以下是FTP的常用函数:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
ftp=FTP() #设置ftp变量
ftp.set_debuglevel(2) #开启调试级别2
ftp.connect("IP","port") #连接的ftp 地址、端口
ftp.login("user","passwd") #ftp的用户名、密码
ftp.cmd("liecol/test") #进入ftp远程目录
bufsize=1024 #设置的缓冲区大小
file_handle=open("test.py","wb").write #以写模式在本地打开文件
ftp.retrbinaly("RETR test.py",file_handle,bufsize) #接收ftp服务器上文件并写入本地文件
ftp.set_debuglevel(0) #关闭调试模式
ftp.quit() #退出ftp
ftp.cwd(path) #设置FTP操作的路径
ftp.dir() #显示ftp目录下的所有信息
ftp.nlst() #获取目录下的文件
ftp.mkd(pathname) #新建ftp目录
ftp.pwd() #返回当前所在位置
ftp.rmd(dirname) #删除远程目录
ftp.delete(filename) #删除远程文件
ftp.rename(fromname, toname) #修改ftp文件名字
ftp.storbinaly("STOR test.txt",file_handel,bufsize) #上传目标文件
ftp.retrbinary("RETR test.txt",file_handel,bufsize) #下载FTP文件

Read More

Requests 一款实用的python http库

Requests 作为Python的一款实用型http库,一直深受好评。让人用完就不太想使用其他的http库。
对于http不太了解的开发,采用其他库,会经常出现安全隐患,性能差,不经意造轮子,代码冗余等病状,
所以,在笔者看来Requests还是比较友好和谐的一款http库。
接下来,我们来看一下Requests和非Requests的对比。

非Requests:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import urllib2
gh_url = 'https://api.github.com'
req = urllib2.Request(gh_url)
password_manager = urllib2.HTTPPasswordMgrWithDefaultRealm()
password_manager.add_password(None, gh_url, 'user', 'pass')
auth_manager = urllib2.HTTPBasicAuthHandler(password_manager)
opener = urllib2.build_opener(auth_manager)
urllib2.install_opener(opener)
handler = urllib2.urlopen(req)
print handler.getcode()
print handler.headers.getheader('content-type')
# ------
# 200
# 'application/json'
Requests:
1
2
3
4
r = requests.get('https://api.github.com/users', auth=('user', 'pass'))
print r.status_code
# ------
# 200

对比后是不是感觉Requests非常的简洁明了。

Read More

locale修改linux语言环境

最近用python脚本做文件写入,进vim看是乱码,以为是自己编码没处理好,处理后,发现打开还是不对。
然后用tail,cat发现又没毛病,而且vim打开所有文件写中文都是如此。
用locale查看了一下当前的语言环境。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=zh_CN.UTF-8
LANGUAGE=zh_CN:zh
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC=zh_CN
LC_TIME=zh_CN
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY=zh_CN
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER=zh_CN
LC_NAME=zh_CN
LC_ADDRESS=zh_CN
LC_TELEPHONE=zh_CN
LC_MEASUREMENT=zh_CN
LC_IDENTIFICATION=zh_CN
LC_ALL=

出现如下错误

  • locale: Cannot set LC_CTYPE to default locale: No such file or directory
  • locale: Cannot set LC_MESSAGES to default locale: No such file or directory
  • locale: Cannot set LC_ALL to default locale: No such file or directory

    Read More

linux修改ip设置

有时候需要修改linux的ip,怕记不住,做个笔记,解决办法如下:

step1(进入修改文件):

1
2
3
sudo vim /etc/config/networking/interfaces
or
sudo vim /etc/network/interfaces

step2(修改文件):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
auto lo
#本地回环接口
iface lo inet loopback
auto eth0
#以太网接口
#iface eth0 inet dhcp
iface eth0 inet static
#连接方式dhcp和固定ip
address 192.168.2.135
#ip地址
gateway 192.168.2.1
#ip网关
netmask 255.255.255.0
#子掩码

Read More

在vmware上安装ubuntu16.04无法进入桌面或者桌面空白解决办法

在虚拟机上安装ubuntu出现了这样的情况,开机后不能进入图形桌面,只能按crl+alt+f1~f6,在文本界面下登陆。
解决办法
step1:
crl+alt+f1写换到文本模式下,键入用户名和密码登陆,然后切换到超级用户状态下:

step2:
输入startx命令切换到图形界面,会发图形界面什么都没有。

step3:
crl+alt+t进入超级终端,安装gdm

step4:

1
2
3
4
5
6
7
8
sudo apt-get install gdm
# 登录显示器
sudo apt-get install ubuntu-desktop
# ubuntu桌面
sudo apt-get install gnome-core
# 图形桌面环境

step5:
重启ubuntu。

图的基本算法bfs浅析

关于图的搜索有两种:广度优先(bfs)深度优先 (dfs)。

A
B C
D E F G H
I

dfs:顺序应该为:ABDEF CGH I

bfs:顺序应该为:ABC DEF GH I

笔者总结:深度优先的过程也就是递归的过程, 而bfs是层级的过程,所以广度优先不可避免的需要用到队列。

Read More

python性能测量工具cProfile

背景:

Python是一种解释性的语言,执行速度相比C、C++等语言十分缓慢;因此我们需要在其它地方上下功夫来提高代码的执行速度。
首先需要对代码进行分析,这个时候则需要用一些工具。
这里介绍cProfile:
全代码分析:
命令行: cProfile -s tottime your_program.py
结果如下:

1
2
3
4
5
6
7
8
9
10
ncalls tottime percall cumtime percall filename:lineno(function)
66 0.001 0.000 11.850 0.180 base.py:228(micro_service)
66 0.003 0.000 11.849 0.180 tools.py:557(micro_service)
1056 0.001 0.000 11.073 0.010 connection.py:463(drain_events)
1056 0.015 0.000 11.072 0.010 connection.py:466(blocking_read)
1056 0.008 0.000 10.920 0.010 transport.py:233(read_frame)
3168 0.014 0.000 10.908 0.003 transport.py:370(_read)
3168 10.892 0.003 10.892 0.003 {method 'recv' of '_socket.socket' objects}
66 0.001 0.000 9.814 0.149 rpc.py:350(__call__)
66 0.001 0.000 8.395 0.127 rpc.py:329(result)

Read More