marshmallow 库的简单学习

[Python [[Python Module]] marshmallow 库的简单学习 marshmallow 是一个简单序列化/反序列化模块。 它可以很轻松的做到 object-->dict objects-->list 等序列化操作,同时经过添加简单的函数做到 dict-->object list-->objects 等反序列化操作。 同时,它对于数据的校检非常友好,有多种校检方式,同时相对于 Schema 库,它可以更有针对性的校检数据,序列化数据等(例如只取某些数据,只校检某些数据等)。 一、简单说明 marshmallow 库非常易于使用,下面将以实际的代码演示如何使用这个库。 先明确下使用流程。 创建类–>创建 Schema 类–>(创建 ValidSchema 类) 序列化<—>反序列化 二、创建Schema类 创建基础的类 # -*- coding:utf-8 -*- from datetime import date from marshmallow import Schema, fields, pprint, post_load from marshmallow import ValidationError, validate, validates class Artist(object): """基础艺术家类""" def __init__(self, name): self.name = name class Album(object): """基础专辑类""" def __init__(self, title, release_date, artist): self.title = title self.release_date = release_date self.artist = artist 根据自己的类创建对应的 Schema 类,继承自 marshmallow 的 Schema 类。 ...

MySQL 内置函数

database [[MySQL]] MySQL 内置函数 字符串函数 查看字符的 ascii 码值 ascii(str),str 是空串时返回 0 select ascii('a'); 查看 ascii 码值对应的字符 char(数字) select char(97); 拼接字符串 concat(str1,str2…) select concat(12,34,'ab'); 包含字符个数 length(str) select length('abc'); 截取字符串 -- left(str,len) 返回字符串 str 的左端 len 个字符 -- right(str,len) 返回字符串 str 的右端 len 个字符 -- substring(str,pos,len) 返回字符串 str 的位置 pos 起 len 个字符 select substring('abc123',2,3); 去除空格 -- ltrim(str) 返回删除了左空格的字符串 str -- rtrim(str) 返回删除了右空格的字符串 str -- trim([方向 remstr from str) 返回从某侧删除 remstr 后的字符串 str,方向词包括 both、leading、trailing,表示两侧、左、右 select trim(' bar '); select trim(leading 'x' FROM 'xxxbarxxx'); select trim(both 'x' FROM 'xxxbarxxx'); select trim(trailing 'x' FROM 'xxxbarxxx'); 返回由 n 个空格字符组成的一个字符串 space(n) select space(10); 替换字符串 replace(str,from_str,to_str) select replace('abc123','123','def'); 大小写转换,函数如下 -- lower(str) -- upper(str) select lower('aBcD'); 数字函数 求绝对值 abs(n) select abs(-32); 求 m 除以 n 的余数 mod(m, n),同运算符 % select mod(10,3); select 10%3; 地板除 floor(n),表示不大于 n 的最大整数 select floor(2.3); 天花板 ceiling(n),表示不小于 n 的最大整数 select ceiling(2.3); 求四舍五入值 round(n,d),n 表示原数,d 表示小数位置,默认为 0 select round(1.6); 求 x 的 y 次幂 pow(x,y) select pow(2,3); 获取圆周率 PI() select PI(); 随机数 rand(),值为 0-1.0 的浮点数 select rand(); 时间日期函数 获取子值,语法如下 -- year(date)返回date的年份(范围在1000到9999) -- month(date)返回date中的月份数值 -- day(date)返回date中的日期数值 -- hour(time)返回time的小时数(范围是0到23) -- minute(time)返回time的分钟数(范围是0到59) -- second(time)返回time的秒数(范围是0到59) select year('2016-12-21'); 日期计算,使用 +- 运算符,数字后面的关键字为 year、month、day、hour、minute、second select '2016-12-21'+interval 1 day; 日期格式化 date_format(date,format),format 参数可用的值如下 -- 获取年%Y,返回4位的整数 -- 获取年%y,返回2位的整数 -- 获取月%m,值为1-12的整数 -- 获取日%d,返回整数 -- 获取时%H,值为0-23的整数 -- 获取时%h,值为1-12的整数 -- 获取分%i,值为0-59的整数 -- 获取秒%s,值为0-59的整数 select date_format('2016-12-21','%Y %m %d'); 当前日期 current_date() select current_date(); 当前时间 current_time() select current_time(); 当前日期时间 now() select now();

MySQL 数据库简介

database MySQL MySQL 数据库简介 mysql 数据库,是当前应用非常广泛的一款关系型数据库。 知识点包括: 数据库与表的创建、删除 字段的类型、约束 关系的存储 数据行的增删改查 数据行的查找(重点) 视图、事务、索引 与 Python 交互 E-R 模型 当前物理的数据库都是按照 E-R 模型进行设计的 E表示entry,实体 R表示relationship,关系 一个实体转换成数据库中的一个表 关系描述两个实体之间的对应规则,包括: 1.一对一 2.一对多 3.多对多 关系转换为数据库表中的一个列*在关系型数据库中一行就是一个对象 三范式 经过研究和对使用中问题的总结,对于设计数据库提出了一些规范,这些规范被称为范式 第一范式(1NF):列不可拆分 第二范式(2NF):唯一标识 第三范式(3NF):引用主键 后一个范式建立在前一个范式的基础上 数据完整性 一个数据库就是一个完整的业务单元,可以包含多张表,数据被存储在表中 在表中为了更加准确的存储数据,保证数据的正确有效,可以在创建表的时候,为表添加一些强制性的验证,包括数据字段的类型、约束 字段类型 数字:int,decimal 字符串:char,varchar,text 日期:datetime 布尔:bit 约束 主键:primary key 非空:not null 唯一:unique 默认:default 外键:foreign key 自动增长:auto_increment

MySQL 的 JSON 类型

database MySQL MySQL 的 JSON 类型 之前的开发经验,让我了解到,在对表的设计时,可以预留一个 JSON 类型的字段,这样可以实现一定程度的扩展,我一开始有些反感,因为这可能滥用。例如说,建表的时候考虑不再那么周全,全部放在 attr 字段里,虽然后期实现没问题,但如果这样为什么不直接用 NoSQL,想怎么存就怎么存。 使用 JSON 类型存储,然后在代码里使用 ORM 的技术,也很容易读取。最近我遇到了一个需求,需要将监控数据以表格的形式展示,通用的 TSDB (使用 Grafana)很难渲染成表格,就决定使用 MySQL 实现。但是监控项那么多,可以考虑使用 JSON 类型存储。 设置 JSON 字段 mysql> CREATE TABLE user(id INT PRIMARY KEY, name VARCHAR(20) , lastlogininfo JSON); Query OK, 0 rows affected (0.27 sec) 设置类型为 JSON 即可。 插入 JSON 数据 字符串法 mysql> INSERT INTO user VALUES(1 ,"lucy",'{"time":"2015-01-01 13:00:00","ip":"192.168.1.1","result":"fail"}'); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO user VALUES(1 ,"lucy",'{"time":"2015-01-01 13:00:00","ip":"192.168.1.1","result":"fail}'); ERROR 3140 (22032): Invalid JSON text: "Missing a closing quotation mark in string." at position 63 in value for column 'user.lastlogininfo'. 只要字符串符合 JSON 语法就可以直接插入,否则会报 Invalid JSON text 错误。 ...

MySQL 相关命令

database MySQL MySQL 相关命令 数据库连接 mysql -u username -p password:***** mysql> 数据库操作 创建数据库: create database dbname charsetutf-8; 删除数据库: drop database dbname; 切换数据库: use dbname; 查看当前选择的数据库: select database(); 展示所有数据库: show databases; 表操作 查看所有表: show tables; 创建表: create table tbname( 列及类型约束 ); # 例如: create table students( id int auto_increment primary key, sname varcahr(10) not null ); 修改表: alter table tbname add|change|drop 列名 类型; # 例如: alter table students add birthday datetime; 删除表: drop table tbname; 查看表结构: desc tbname; 更改表名称: rename table old-tbname to new-tbname; 查看表的创建语句: show create table tbname; 数据操作 查询: select * from tbname; 增加: ...

MySQL 连接 Python

database MySQL Python MySQL 连接 Python 0.安装引入模块 使用接口Python DB API 安装mysql模块 pip install mysql-connector-python # python2.7,使用 Python-MySQL connector pip install pymysql # python3.4,安装 pymysql 模块 引入模块 import pymsql #python3.x import mysql.connector #py2.x 1.connection 对象 用于建立与数据库的连接 创建方法: # host:连接的 mysql 主机,本机填为 ‘localhost’ # port:连接的 mysql 主机的端口,默认为 3306 # user:连接的用户名 # passwd:连接的用户的密码 # db:连接的数据库名 conn = pymysql.Connect(host,port,user,passwd,db) # Python 3.x connection 对象的方法 close():关闭连接 commit():提交修改 rollback():回滚事务 cursor():返回 cursor 对象 2.cursor对象 用于执行语句 创建方法: cursor = conn.cursor() 方法 execute(op,[args]) # 执行一个数据库查询和命令 fetchone() # 取得结果集的下一行 fetchmany(size) # 取得结果集的下几行 fetchall() # 取得结果集的剩下的所有行 rowcount # 最近一次execute返回数据的行数或影响行数 close() # 关闭游标对象 属性 rowcount 只读属性,表示最近一次 execute() 执行后受影响的行数 connection 获得当前连接对象 3.查询的一般流程 select查询数据操作过程: 开始 创建connection 创建cursor 使用cursor.excute()执行select语句 使用cursor.fetch*()获取并处理数据 关闭cursor 关闭connection 结束 4.常见查询语句 # 增加 import pymysql try: conn = pymysql.Connect(host,port,user,passwd,db) cs1=conn.cursor() count=cs1.execute("insert into students(sname) values('张良')") print(count) conn.commit() cs1.close() conn.close() except Exception,e: print e.message # 删除 # -*- coding: utf-8 -*- import pymysql try: conn = pymysql.Connect(host,port,user,passwd,db) cs1=conn.cursor() count=cs1.execute("delete from students where id=6") print(count) conn.commit() cs1.close() conn.close() except Exception,e: print e.message # 查询一行数据 #-*- coding: utf-8 -*- import pymysql try: conn = pymysql.Connect(host,port,user,passwd,db) cur=conn.cursor() cur.execute('select * from students where id=7') result=cur.fetchone() print() cur.close() conn.close() except Exception,e: print e.message # 查询多行数据 #-*- coding: utf-8 -*- import pymysql try: conn = pymysql.Connect(host,port,user,passwd,db) cur=conn.cursor() cur.execute('select * from students') result=cur.fetchall() print(result) cur.close() conn.close() except Exception,e: print e.message 5.SQL 语句参数化 以参数传递的方式执行 sql 脚本,为之后的封装打基础 例如: #-*- coding: utf-8 -*- import pymysql try: conn = pymysql.Connect(host,port,user,passwd,db) cs1=conn.cursor() sname=raw_input("请输入学生姓名:") #参数 params=[sname] #参数封装成列表 count=cs1.execute('insert into students(sname) values(%s)',params) #%传参 print(count) conn.commit() cs1.close() conn.close() except Exception,e: print e.message 6.封装 将常见的语句封装成方法,以传参的方式执行语句,防注入 例如: #-*- coding: utf-8 -*- import pymysql class MysqlHelper(): def __init__(self,host,port,db,user,passwd,charset='utf8'): self.host=host self.port=port self.db=db self.user=user self.passwd=passwd self.charset=charset def connect(self): self.conn=MySQLdb.connect(host=self.host,port=self.port,db=self.db,user=self.user,passwd=self.passwd,charset=self.charset) self.cursor=self.conn.cursor() def close(self): self.cursor.close() self.conn.close() def get_one(self,sql,params=()): result=None try: self.connect() self.cursor.execute(sql, params) result = self.cursor.fetchone() self.close() except Exception, e: print e.message return result def get_all(self,sql,params=()): list=() try: self.connect() self.cursor.execute(sql,params) list=self.cursor.fetchall() self.close() except Exception,e: print e.message return list def insert(self,sql,params=()): return self.__edit(sql,params) def update(self, sql, params=()): return self.__edit(sql, params) def delete(self, sql, params=()): return self.__edit(sql, params) def __edit(self,sql,params): count=0 try: self.connect() count=self.cursor.execute(sql,params) self.conn.commit() self.close() except Exception,e: print e.message return count

nfs 卸载技巧

Linux file system nfs 卸载技巧 由于 nfs 的网络通信,一般来说,df或者ls等影响到磁盘的命令卡住,甚至卡死是因为 nfs 连接出现了问题。一般来说,要么服务端重启服务或者客户端重启服务就好。退而求其次的方法是umount nfs盘,但往往没办法直接搞定。一般会直接卡住或者提示 device busy。 那么我们就去伪造一个对端,我们可以搞个虚拟机,或者本机网络接口分配一个服务端端的ip,可以ping通。 ifconfig eth0:fakenfs 192.0.2.55 netmask 255.255.255.255 #其中 192.0.2.55 是 nfs 服务端的ip ip link set eth0 up 此时我们的机器需要开启nfs服务,Ubuntu的话就 apt install ntfs-kernel-server。 然后再尝试强制卸载 nfs 云盘:umount -fl /your/path。 之后需要把本机配置的 ip 给清掉: ifconfig eth0 del 192.0.2.55 ip link set eth0 down 参考 mount - 强制卸载NFS挂载目录 Linux强制卸载设备 nfs挂载无法卸载

nfs 的基本使用

Linux [[file system]] nfs 的基本使用 nfs 的架构 nfs 可以理解为“网盘”,即本地可以挂载远端的盘,不考虑物理上的io瓶颈,上下行带宽多大则io速度多快。典型的C/S的架构,运行过程中对CPU有依赖。 nfs 安装 # 服务端 sudo apt install nfs-kernel-server # 客户端 sudo apt install nfs-common nfs 使用 简单来说,分三步: 服务端创建文件系统 nfs配置文件中确定文件系统以及访问限制 客户端连接指定的nfs /etc/exports NFS服务端对分享目录的配置文件 /etc/exports.d NFS服务端对分享目录配置文件的扩展目录,值得注意的是:只有扩展名为.exports的文件会被NFS读取并应用,其他文件都会被忽略。 /var/lib/nfs/etab NFS对外分享目录的主配置文件,它是由exportfs命令维护的,其信息与NFS内核中的配置信息保持同步。注:请不要手动编辑该文件。 /var/lib/nfs/rmtab 客户端访问的目录列表,由NFS系统维护,请不要手动编辑。 root@localhost:~# cat /etc/exports # /etc/exports: the access control list for filesystems which may be exported # to NFS clients. See exports(5). # # Example for NFSv2 and NFSv3: # /srv/homes hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check) # # Example for NFSv4: # /srv/nfs4 gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check) # /srv/nfs4/homes gss/krb5i(rw,sync,no_subtree_check) # /mnt/nfs 192.168.0.0/24(rw,sync,no_subtree_check) $ sudo mount -t nfs host:/$dir $ddir 参考 如何在Ubuntu 18.04上设置NFS挂载 Linux 下的 NFS 系统简介

Oracle 的字符集与乱码

database Oracle Oracle 的字符集与乱码 最近有个需求,通过 python 处理数据,然后将数据存入到 oracle 11g 库中,中间遇到了一些编码相关的问题。由于可以直接登录上 oracle 所在的服务器,所以在本机上的 sqlplus 属于客户端,只是直接连接了本机,既然这样的话,就需要配置 NLS_LANG。 很多文章只会提到,将 NLS_LANG 配置改成 SIMPLIFIED CHINESE_CHINA.AL32UTF8,或者通过 os.environ 进行设置,这确实可以解决问题,但真正的原因并不是改个这个就完事了。 其实 oracle 数据库已经做了很多的字符转换工作,只要配置得当,那么数据就能正常存入,查询,转码的过程中也不会出问题,所以就必须知道,字符具体会在那些地方变更。 下面的这篇文章解决了我的问题,也让编码问题更为清晰。 字符集的作用 字符集问题一直叫人头疼,究其原因还是不能完全明白其运作原理。 在整个运行环节中,字符集在 3 个环节中发挥作用: 软件在操作系统上运作时的对用户的显示,此时采用操作系统定义的字符集进行显示。我们在系统 I/O 编程的时候经常要指定字符集,C# 中的 Text.Encoding=Encoding.Default 实际上就是告诉编译器,文本使用系统定义的默认字符集进行编码。sqlplus 也是运行在操作系统上的软件,当然要使用系统所指定的字符集对外显示内容。 数据向 Oracle 服务端传送前的通告。也就是 sqlplus 告诉服务器现在使用的字符集是什么。 数据流到达服务器后,按照服务器所使用的字符集自动翻译客户端的数据,然后存储进系统。 在客户端 sqlplus 和服务端传送数据,数据会按照服务端字符集进行翻译,这个过程是自动完成的不需要人工干预。任何时候,oracle 服务端总是按照自己的字符集设置来存取数据,客户端要想正确显示从服务端读取到的数据,也需要按照本地的字符集设置进行翻译,这个过程也是自动的。(重点是 按照本地的字符集设置) 服务器端需要采用合适的字符集进行数据存储,这个很容易理解,ASCII 字符集没办法用来存储中文汉字,因为它根本没有描述汉字所需要的编码空间。 问题常常存在于客户端与服务端通讯的过程中,sqlplus 作为运行在操作系统上的软件,无论是显示还是通讯,必然使用操作系统所使用的字符集设置。无论 sqlplus 设置的字符集,作用只有一个,那就是通告服务器端,为相互之间的字符集翻译做准备。 客户端的字符集设置是在NLS_LANG环境变量中设置的,客户读端的字符集可以和oracle客户端设置得不一样(本来人家就是自动翻译的),但是客户端字符集一定要和操作系统设置的字符集相匹配!(后面会有匹配表) 出现编码错误的原因 考虑一下,sqlplus 使用的是操作系统的字符集定义在显示和发送数据(假设是 TYPE_A),却告诉 oracle 服务器自己使用的字符集是 TYPE_B,oracle 服务器会怎么办?它会将客户端发送过来的 TYPE_A 数据当作 TYPE_B 字符集格式用自身的 TYPE_C 字符集进行翻译,然后再存储进系统,这就形成了乱码。反向的过程类似,Oracle服务器发出的数据格式没有疑问是 TYPE_C,但是客户端软件认为自己使用的编码是 TYPE_B 并进行了翻译,交给操作系统用 TYPE_A 字符集总的字符/编码映射关系进行翻译显示,最终导致了无法正确显示。 ...

paramiko 库的简单学习

[[Python]] [[Python Module]] paramiko 库的简单学习 paramiko,一个听起来不像英语的库,在诸多英文名的库中独立旗帜(官方解释为:“Paramiko” is a combination of the Esperanto words for “paranoid” and “friend”)。 它的主要功能就是实现对 ssh 协议的封装,能够在一个更高层面上,轻松地使用 ssh 以及 sftp 等功能。 一、安装 pip install paramiko 二、ssh 连接对象 1.使用密码连接 import paramiko # 这行代码可以生成连接日志,大部分情况下不需要 # paramiko.util.log_to_file('/tmp/sshout') ssh = paramiko.SSHClient() #这行代码的作用是允许连接不在know_hosts文件中的主机。 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect("IP", port, "username", "password") 2.使用秘钥连接 import paramiko ssh = paramiko.SSHClient() ssh.connect('10.120.48.109', port, '用户名', key_filename='私钥') 三、ssh 执行指令 成功连接主机后,可以使用 ssh.exec_command(cmd) 的方法执行指令。 但默认返回三个 paramiko.channelfile 对象,我们可以用以下的方法读取数据或者写入确认等。 stdin, stdout, stderr = ssh.exec_command(cmd) # 如果成功,stdout会拿到输出的结果 for line in stdout.readlines(): print(line) # 执行过程中,可以使用以下方法进行确认,但此时的确认是对指令操作过程中的指令,例如“确认删除”等 stdin.write('Y') # 执行过程中若出现错误信息,报错信息会保存在stderr中 四、sftp 对象 paramiko 的 sftp 对象有多种生成方式。 倘若已有 ssh 对象,则: ...