2020.07-2020.09 学习总结
[TOC]
C++
C++ 基于容器(docker)的开发环境配置
配置ODBC
在安装配置之前,需要先大概了解一下 MyODBC 的架构,MyODBC 体系结构建立在 5 个组件上,如下图所示:
Driver Manager
负责管理应用程序和驱动程序间的通信,主要功能包括:解析 DSN (数据源名称,ODBC 的数据源名称在 odbc.ini 文件中配置),加载和卸载驱动程序,处理 ODBC 调用,将其传递给驱动程序。
ODBC.INI
odbc.ini 是 ODBC 配置文件,记录了连接到服务器所需的驱动信息和数据库信息。Driver Manager 将使用它来确定加载哪个驱动程序(使用数据源名 DSN )。驱动程序将根据指定的DSN来读取连接参数。
Connector/ODBC(MyODBC驱动程序)
实现 ODBC API 所提供的功能,它负责处理 ODBC 函数调用,将 SQL 请求提交给 MySQL 服务器,并将结果返回给应用程序。
在 Linux 下配置 mysql ODBC 需要有以下步骤:
1 | 1. 安装 Driver Manager,本案例使用 unixODBC 来作为 Driver Manager。 |
第一步:下载安装包
需要下载两个安装包 unixODBC 2.3.0
和 mysql Connector/ODBC 3.51
unixODBC 源码包:ftp://ftp.unixodbc.org/pub/unixODBC/unixODBC-2.3.0.tar.gz
mysql Connector/ODBC 源码包:http://dev.mysql.com/downloads/connector/odbc/3.51.html%23downloads
选择
1 | 版本:5.1.11 |
第二步:安装 unixODBC
1 | tar -zxvf unixODBC-2.3.4.tar.gz |
安装完成后,可以在/usr/bin目录下有下面的文件
1 | -rwxr-xr-x 1 root root 75312 Nov 1 16:22 odbcinst |
在/usr/local/lib目录下面有这些文件
1 | -rwxr-xr-x 1 root root 422955 Nov 1 16:22 libodbcinst.so.1.0.0 |
第三步:安装 mysql Connector/ODBC
1 | tar -zxvf mysql-connector-odbc-5.1.11-linux-el6-x86-64bit.tar.gz |
注册驱动
1 | ./myodbc-installer -d -a -n "MySQL ODBC 5.1 Driver" -t "DRIVER=/usr/local/lib/libmyodbc5.so;SETUP=/usr/local/lib/libmyodbc5.so" |
假如注册的时候报错找不到libodbc.so.2,但是之前确实装成功了unixodbc,可能是因为系统找不到/usr/local/lib库目录,需要添加系统搜索库目录路径:
1 | vi /etc/ld.so.conf |
第四步:配置 ODBC.INI
1 | odbcinst -j |
编辑文件/etc/odbc.ini
,把下面的内容加上去。不同版本mysql
驱动的配置方法,有细微差异。此处使用的版本是mysql Connector 3.51
。
1 | [mysqlDSN] |
第五步:设置环境变量
1 | export DBCINI=/usr/local/etc/odbc.ini |
第六步:重启电脑
1 | reboot |
第七步:测试ODBC配置是否成功
isql 是 unixODBC 带的一个 ODBC 客户端访问工具,使用isql +数据源名
来访问目标数据库。如果 ODBC 配置正确,会显示下面的界面。在SQL>
提示符下输入 SQL 语句查询数据库。
1 | isql mysqlDSN |
遇到的问题:
- 问题1
在第三步安装 mysql connector/ODBC 中的注册驱动中,我总是会出现./myodbc-installer: error while loading shared libraries: libodbc.so.2: cannot open shared object file: No such file or directory.
这种错误,后来发现错误有两点:- 我下载的是 mysql-connector-5.3.6 ,可能版本比较高,而我初次下载用的是unixODBC-2.3.0,版本较低,里面没有 libodbc.so.2 这个库文件(可以用
find / -name libodbc.so.2
来查)。后来下载了一个 unixODBC-2.3.4 就好了。 - 改了版本之后,我发现还是有这个错误,在网上查了下,说是程序查找默认路径为 /lib 和 /usr/lib,而我的 libmyodbc5w.so 和 libmmyodbc5a.so 都在 /usr/local/lib 中,所以查不到,所以需要设置一下共享库路径,以下我贴一下网上查的内容:
- 我下载的是 mysql-connector-5.3.6 ,可能版本比较高,而我初次下载用的是unixODBC-2.3.0,版本较低,里面没有 libodbc.so.2 这个库文件(可以用
1 | cat /etc/ld.so.conf |
问题2
如果共享库文件安装到了其它非/lib
或/usr/lib
目录下,但是又不想在/etc/ld.so.conf
中加路径(或者是没有权限加路径)。那可以 export 一个全局变量LD_LIBRARY_PATH
,然后运行程序的时候就会去这个目录中找共享库。LD_LIBRARY_PATH
的意思是告诉 loader 在哪些目录中可以找到共享库。
可以设置多个搜索目录,这些目录之间用冒号分隔开。
比如:
安装了一个 mysql 到/usr/local/mysql
目录下,其中有一大堆库文件在/usr/local/mysql/lib
下面,则可以在 .bashrc 或 .bash_profile 或 shell 里加入以下语句即可:1
export LD_LIBRARY_PATH=/usr/local/mysql/lib:$LD_LIBRARY_PATH
一般来讲这只是一种临时的解决方案,在没有权限或临时需要的时候使用。
问题3
如果程序需要的库文件比系统目前存在的村文件版本低,可以做一个链接
比如:1
2error while loading shared libraries: libncurses.so.4: cannot open shared
object file: No such file or directory1
2
3ls /usr/lib/libncu*
/usr/lib/libncurses.a /usr/lib/libncurses.so.5
/usr/lib/libncurses.so /usr/lib/libncurses.so.5.3可见虽然没有 libncurses.so.4,但有 libncurses.so.5,是可以向下兼容的
建一个链接就好了1
ln -s /usr/lib/libncurses.so.5.3 /usr/lib/libncurses.so.4
问题4
isql 连接数据库失败,重新注册驱动:1
2/usr/bin/myodbc-installer -d -a -n "MySQL_UNICODE" -t "DRIVER=/usr/lib64/libmyodbc8w.so;SETUP=/usr/lib64/libmyodbc8w.so"
/usr/bin/myodbc-installer -d -a -n "MySQL_ANSI" -t "DRIVER=/usr/lib64/libmyodbc8a.so;SETUP=/usr/lib64/libmyodbc8a.so"使用 rpm 命令查看 rpm 包的内容
1
rpm -qpl xxx.rpm
可以看到
mysql-connector-odbc-8.0.20-1.el7.x86_64.rpm
的包内容1
2
3
4
5
6
7
8
9
10warning: mysql-connector-odbc-8.0.20-1.el7.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY
/usr/bin/myodbc-installer
/usr/lib64/libmyodbc8a.so
/usr/lib64/libmyodbc8w.so
/usr/share/doc/mysql-connector-odbc-8.0.20
/usr/share/doc/mysql-connector-odbc-8.0.20/ChangeLog
/usr/share/doc/mysql-connector-odbc-8.0.20/INFO_BIN
/usr/share/doc/mysql-connector-odbc-8.0.20/INFO_SRC
/usr/share/doc/mysql-connector-odbc-8.0.20/LICENSE.txt
/usr/share/doc/mysql-connector-odbc-8.0.20/README.txt可以知道 rpm 包 安装的时候各个基础件的安装位置。
NGINX 的配置与基础命令
nginx 配置
查看 nginx 配置文件
1 | cat /etc/nginx/nginx.conf |
可以看到 stdname
对应的监听端口设置 nginx 监听 18026 并转发至 stdnameSvr 的 监听端口 19026。
1 | server { |
验证 nginx 配置文件是否正确
进入 nginx 安装目录 sbin 下,输入命令
1 | ./nginx -t |
看到如下显示
1 | nginx: the configuration file /.../nginx.conf syntax is ok |
说明配置文件正确!
运行 nginx
1 | /path_of_nginx/nginx -c /path_of_nginx.conf/nginx.conf |
-c
:指定 nginx 运行时使用的 conf 文件路径-t
:加上-t
可以测试 nginx 配置是否正确
停止 nginx
查看进程号然后杀死进程
1 | ps -ef | grep nginx |
重启 nginx
方法一:
找到 nginx 可执行文件路径,然后输入命令:
1 | nginx -s reload |
方法二:
查找当前 nginx 进程号,然后输入命令:
1 | kill -HUP <pid_of_nginx> |
实现重启 nginx 服务。
Docker 端口映射
1 | docker run -it -p 8080:18026 <REPOSITORY>:<TAG> /bin/bash |
-p
:是容器内部端口绑定到指定的主机端口。这里指将主机的8080端口映射到容器的18026端口。
1 | docker run -it -p 127.0.0.1:8080:18026 <REPOSITORY>:<TAG> /bin/bash |
这样我们就可以通过访问 127.0.0.1:8080 来访问容器的 18026 端口。
上面的例子中,默认都是绑定 tcp 端口,如果要绑定 UDP 端口,可以在端口后面加上 /udp。
1 | docker run -it -p 127.0.0.1:8080:18026/udp <REPOSITORY>:<TAG> /bin/bash |
docker port <CONTAINER ID> <PORT>
命令可以让我们快捷地查看端口的绑定情况。
启动微服务
1 | git clone --recurse-submodules https://gitlab.xxxxxxxx.net/.../*.git |
注释:****spawn-fcgi 用法了解
spawn-fcgi 是一个小程序,作用是管理 fast-cgi 进程。
用 spawn 启动 FCGI 程序的方式为:
1 | ./spawn-fcgi -a 127.0.0.1 -p 8080 -F ${count} -f ${webroot}/bin/demo.fcgi |
这样就会启动 count 个 demo.fcgi 程序,他们共同监听同一个 listen 端口 8080,从而提供服务。
1 | ./spawn_fcgi -h |
C++ OTL 流处理包
<返回目录>
otl的源码只有一个头文件——otlv4.h。下面以一个例子来说明如何使用otl。
1 |
|
上面代码例子连接Oracle
数据库用到了rlogon()
函数,调用它时需要为它提供一个连接字符串,一般是这样的:
1 | [User Name]/[Password]@[TNS Alias] |
这里的TNS Alias
指在tnsnames.ora
中配置TNS
名,比如我的tnsnames.ora
里有以下的配置:
1 | # tnsnames.ora Network Configuration File: D:\oracle\product\10.2.0\db_1\network\admin\tnsnames.ora |
1 | ORCL = |
那么TNS Alias
就是ORCL
。
此外需要注意的是使用otl
连接oracle
数据库需要链接oci.lib
,也就是说需要包含它的头文件和库文件路径。
Vector 遍历的几种方法
vector<int> v1{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10};
一、通过数组下标遍历
1 | for (size_t i = 0; i < v1.size(); i++) |
二、通过迭代器遍历
1 | for (vector<int>::iterator iter = v1.begin(); iter != v1.end(); iter++) |
三、C++11标准,auto关键字遍历
1 | for (auto iter = v1.begin(); iter != v1.end(); iter++) |
四、for_each加函数
1 |
|
C++ 计时方法——chrono
<返回目录>
传统计时方法:
1 |
|
此方法可以精确到毫秒,输出样例:花费了0.123秒
C++11 最佳计时方法:
1 |
|
其他开发过程中可能会遇到的坑
1 | public protected private virtual const override explicit extern |
- 以上限定词的作用以及继承关系的嵌套需要更加明晰,很容易被这些限定词把逻辑弄乱。
1 | CurlCXX curl(url, 1); //1s timeout |
- 注意学会
curl
发包的用法,并且post
时,body
当中要注意fastcgi
框架当中约定了post
数据格式为x-www-form-urlencoded/form-data
,因此一定要注意body
里面的数据,单个字段内不能出现容易导致解析错误的'&'
字符,若不得不包含'&'
字符,则要用转义字符'\&'
包起来,否则会导致参数错误。
1 | const CallRecord *app; |
- 注意对
const
类型的对象操作时,需要用const_cast<XXXXXX>
对该对象进行强制类型转换。
MySQL
SQL SELECT DISTINCT 语句
<返回目录>
在表中,一个列可能会包含多个重复值,有时您也许希望仅仅列出不同(distinct)的值。DISTINCT 关键词用于返回唯一不同的值。
SQL SELECT DISTINCT 语法:
1 | SELECT DISTINCT column_name,column_name |
SQL UPDATE 语句
<返回目录>
UPDATE 语句用于更新表中已存在的记录。
SQL UPDATE 语法:
1 | UPDATE table_name |
请注意 : SQL UPDATE 语句中的 WHERE 子句!WHERE 子句规定哪条记录或者哪些记录需要更新。如果您省略了 WHERE 子句,所有的记录都将被更新!
SQL DELETE 语句
<返回目录>
DELETE 语句用于删除表中的行(记录)。
SQL DELETE 语法:
1 | DELETE FROM table_name |
请注意 : SQL DELETE 语句中的 WHERE 子句!WHERE 子句规定哪条记录或者哪些记录需要删除。如果您省略了 WHERE 子句,所有的记录都将被删除!
SQL REGEXP 语句
<返回目录>
作为一个更为复杂的示例,正则表达式 B[an]*s
匹配下述字符串中的任何一个:Bananas,Baaaaas,Bs
,以及以 B 开始,以 s 结束、并在其中包含任意数目 a 或 n 字符的任何其他字符串。
以下是可用于随 REGEXP 操作符的表的模式。
应用示例,查找用户表中 Email 格式错误的用户记录:
1 | SELECT * |
MySQL 数据库中正则表达式的语法,主要包括各种符号的含义。
^ 字符
匹配字符串的开始位置,如 ^a
表示以字母 a 开头的字符串。
1 | mysql> SELECT 'xxxyyy' REGEXP '^xx'; |
查询 xxxyyy 字符串中是否以 xx 开头,结果值为 1,表示值为 true,满足条件。
$ 字符
匹配字符串的结束位置,如 X$
表示以字母 X 结尾的字符串。
. 字符
这个字符就是英文下的点,它匹配任何一个字符,包括回车、换行等。
* 字符
星号匹配 0 个或多个字符,在它之前必须有内容。如:
1 | mysql> SELECT 'xxxyyy' REGEXP 'x*'; |
这个 SQL 语句,正则匹配为 true。
+ 字符
加号匹配 1 个或多个字符,在它之前也必须有内容。加号跟星号的用法类似,只是星号允许出现 0 次,加号则必须至少出现一次。
? 字符
问号匹配 0 次或 1 次。
实例:
查询找到所有的名字以 st 开头:
1 | mysql> SELECT name FROM person_tbl WHERE name REGEXP '^st'; |
一个正则表达式中的可以使用以下保留字。
^
所匹配的字符串以后面的字符串开头:
1 | mysql> SELECT "fonfo" REGEXP "^fo$"; -> 0(表示不匹配) |
$
所匹配的字符串以前面的字符串结尾:
1 | mysql> SELECT "fono" REGEXP "^fono$"; -> 1(表示匹配) |
.
匹配任何字符(包括新行):
1 | mysql> SELECT "fofo" REGEXP "^f.*"; -> 1(表示匹配) |
a*
匹配任意多个 a(包括空串):
1 | mysql> SELECT "Ban" REGEXP "^Ba*n"; -> 1(表示匹配) |
a+
匹配任意多个 a(不包括空串):
1 | mysql> SELECT "Ban" REGEXP "^Ba+n"; -> 1(表示匹配) |
a?
匹配一个或零个 a:
1 | mysql> SELECT "Bn" REGEXP "^Ba?n"; -> 1(表示匹配) |
de|abc
匹配 de 或 abc:
1 | mysql> SELECT "pi" REGEXP "pi|apa"; -> 1(表示匹配) |
(abc)*
匹配任意多个abc(包括空串):
1 | mysql> SELECT "pi" REGEXP "^(pi)*$"; -> 1(表示匹配) |
{1}
{2,3}
这是一个更全面的方法,它可以实现前面好几种保留字的功能。
a* 可以写成 a{0,}
。
a+ 可以写成 a{1,}
。
a? 可以写成 a{0,1}
。
在 {} 内只有一个整型参数 i,表示字符只能出现 i 次;在 {} 内有一个整型参数 i,后面跟一个 ,,表示字符可以出现 i 次或 i 次以上;在 {} 内只有一个整型参数 i,后面跟一个 ,,再跟一个整型参数 j, 表示字符只能出现 i 次以上,j 次以下(包括 i 次和 j 次)。其中的整型参数必须大于等于 0,小于等于 RE_DUP_MAX(默认是 255)。 如果有两个参数,第二个必须大于等于第一个。
[a-dX] 匹配 “a”、“b”、“c”、“d”
或 “X”
。
[^a-dX] 匹配除 “a”、“b”、“c”、“d”、“X”
以外的任何字符。
“[”、“]”必须成对使用:
1 | mysql> SELECT "aXbc" REGEXP "[a-dXYZ]"; -> 1(表示匹配) |
SQL IN 操作符
<返回目录>
IN 操作符允许您在 WHERE 子句中规定多个值。
SQL IN 语法:
1 | SELECT column_name(s) |
SQL BETWEEN 操作符
<返回目录>
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
SQL BETWEEN 语法:
1 | SELECT column_name(s) |
SQL 别名
<返回目录>
通过使用 SQL,可以为表名称或列名称指定别名。基本上,创建别名是为了让列名称的可读性更强。
列的 SQL 别名语法:
1 | SELECT column_name AS alias_name |
表的 SQL 别名语法:
1 | SELECT column_name(s) |
SQL JOIN
<返回目录>
SQL JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段。
INNER JOIN
:如果表中有至少一个匹配,则返回行LEFT JOIN
:即使右表中没有匹配,也从左表返回所有的行RIGHT JOIN
:即使左表中没有匹配,也从右表返回所有的行FULL JOIN
:只要其中一个表中存在匹配,则返回行
SQL INNER JOIN 关键字
INNER JOIN 关键字在表中存在至少一个匹配时返回行。
SQL INNER JOIN 语法:
1 | SELECT column_name(s) |
或:
1 | SELECT column_name(s) |
注释:INNER JOIN 与 JOIN 是相同的。
SQL LEFT JOIN 关键字
LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为 NULL。
SQL LEFT JOIN 语法:
1 | SELECT column_name(s) |
或:
1 | SELECT column_name(s) |
注释:在某些数据库中,LEFT JOIN 称为 LEFT OUTER JOIN。
注释:LEFT JOIN 关键字从左表(Websites)返回所有的行,即使右表(access_log)中没有匹配。
SQL RIGHT JOIN 关键字
RIGHT JOIN 关键字从右表(table2)返回所有的行,即使左表(table1)中没有匹配。如果左表中没有匹配,则结果为 NULL。
SQL RIGHT JOIN 语法:
1 | SELECT column_name(s) |
或:
1 | SELECT column_name(s) |
注释:在某些数据库中,RIGHT JOIN 称为 RIGHT OUTER JOIN。
注释:RIGHT JOIN 关键字从右表(Websites)返回所有的行,即使左表(access_log)中没有匹配。
SQL FULL OUTER JOIN 关键字
FULL OUTER JOIN 关键字只要左表(table1)和右表(table2)其中一个表中存在匹配,则返回行。
FULL OUTER JOIN 关键字结合了 LEFT JOIN 和 RIGHT JOIN 的结果。
SQL FULL OUTER JOIN 语法:
1 | SELECT column_name(s) |
注释:FULL OUTER JOIN 关键字返回左表(Websites)和右表(access_log)中所有的行。如果 “Websites” 表中的行在 “access_log” 中没有匹配或者 “access_log” 表中的行在 “Websites” 表中没有匹配,也会列出这些行。
注释:MySQL中不支持 FULL OUTER JOIN
SQL UNION 操作符
<返回目录>
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。
SQL UNION 语法:
1 | SELECT column_name(s) FROM table1 |
注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
SQL UNION ALL 语法:
1 | SELECT column_name(s) FROM table1 |
注释:UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。
SQL INSERT INTO SELECT 语句
<返回目录>
通过 SQL,您可以从一个表复制信息到另一个表。
INSERT INTO SELECT 语句从一个表复制数据,然后把数据插入到一个已存在的表中。目标表中任何已存在的行都不会受影响。
SQL INSERT INTO SELECT 语法:
1 | //我们可以从一个表中复制所有的列插入到另一个已存在的表中: |
MySQL 复制表(MySQL的SELECT INTO FROM 语句)
<返回目录>
复制表结构及其数据:
1 | CREATE TABLE table_name_new AS SELECT * FROM table_name_old |
只复制表结构:
1 | CREATE TABLE table_name_new AS SELECT * FROM table_name_old WHERE 1=2; |
- 或者:
1 | CREATE TABLE table_name_new LIKE table_name_old |
只复制表数据:
- 如果两个表结构一样:
1 | INSERT INTO table_name_new SELECT * FROM table_name_old |
- 如果两个表结构不一样:
1 | INSERT INTO table_name_new(column1,column2...) SELECT column1,column2... FROM table_name_old |
SELECT INTO FROM 和 INSERT INTO SELECT 的区别:
主要区别:SELECT INTO FROM 要求目标表不存在,因为在插入时会自动创建;INSERT INTO SELECT FROM 要求目标表存在。
SELECT INTO FROM :将查询出来的数据整理到一张新表中保存,表结构与查询结构一致。
1 | SELECT *(查询出来的结果) INTO newtable(新的表名)FROM WHERE (后续条件) |
即,查询出来结果—>复制一张同结构的空表—>将数据拷贝进去。
INSERT INTO SELECT :为已经存在的表批量添加新数据。
1 | INSERT INTO (准备好的表) SELECT *(或者取用自己想要的结构)FROM 表名 WHERE 各种条件 |
即,指定一张想要插入数据的表格—>对数据进行加工筛选—>填入一张准备好的表格。
SQL 约束(Constraints)
<返回目录>
SQL 约束用于规定表中的数据规则。如果存在违反约束的数据行为,行为会被约束终止。
约束可以在创建表时规定(通过 CREATE TABLE 语句),或者在表创建之后规定(通过 ALTER TABLE 语句)。
SQL CREATE TABLE + CONSTRAINT 语法
1 | CREATE TABLE table_name |
在 SQL 中,我们有如下约束:
NOT NULL
- 指示某列不能存储 NULL 值。UNIQUE
- 保证某列的每行必须有唯一的值。PRIMARY KEY
- (NOT NULL
和UNIQUE
的结合)。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。FOREIGN KEY
- 保证一个表中的数据匹配另一个表中的值的参照完整性。CHECK
- 保证列中的值符合指定的条件。DEFAULT
- 规定没有给列赋值时的默认值。
SQL ALTER TABLE 语句
<返回目录>
ALTER TABLE 语句用于在已有的表中添加、删除或修改列。
SQL ALTER TABLE 语法:
如需在表中添加列,请使用下面的语法:
1 | ALTER TABLE table_name |
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
1 | ALTER TABLE table_name |
要改变表中列的数据类型,请使用下面的语法:
1 | ALTER TABLE table_name |
SQL AUTO INCREMENT 字段
<返回目录>
AUTO-INCREMENT 会在新记录插入表中时生成一个唯一的数字。
AUTO INCREMENT 字段
我们通常希望在每次插入新记录时,自动地创建主键字段的值。
SQL CREATE VIEW 语句
<返回目录>
在 SQL 中,视图是基于 SQL 语句的结果集的可视化的表。
视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。
您可以向视图添加 SQL 函数、WHERE 以及 JOIN 语句,也可以呈现数据,就像这些数据来自于某个单一的表一样。
SQL CREATE VIEW 语法:
1 | CREATE VIEW view_name AS |
注释:视图总是显示最新的数据!每当用户查询视图时,数据库引擎通过使用视图的 SQL 语句重建数据。
SQL 撤销视图
<返回目录>
您可以通过 DROP VIEW 命令来删除视图。
SQL DROP VIEW 语法:
1 | DROP VIEW view_name |
MySQL中修改表名,表属性名等操作
1 | ALTER TABLE 表名 CHANGE 原列名 新列名 类型; --修改表的列属性名 |
其他的问题
mysql清空表数据后如何让自增ID仍从1开始?
也就是说如何重排 auto_increment
两种方法:
1、清空表时使用truncate
命令,而不用delete
命令
1 | TRUNCATE TABLE table_name ; |
使用truncate
命令的好处:
1)、速度快
2)、可以对自增 ID 进行重排,使自增 ID 仍从1开始计算
2、清空表数据后,使用alter修改表
1 | ALTER TABLE table_name AUTO_INCREMENT = 1; |
mysql 建立索引
INDEX idx_interface_name
( interface_name
) USING BTREE 建立B树索引
mysql 插入数据
如果对应元素有默认值,则可以,在 INSERT 时为空,不然会报错。
mysql 时间戳设置
DEFAULT CURRENT_TIMESTAMP 表示当插入数据的时候,该字段默认值为当前时间
ON UPDATE CURRENT_TIMESTAMP 在数据库数据有更新的时候UPDATE_TIME的时间会自动更新
mysql 主键自增设置
AUTO_INCREMENT 用于主键自动增长
Python
python 读取 Excel 文档
1 | def read_excel(self, path): |
python Excel 数据处理
<返回目录>
Excel 转换成 SQL 语句
单独拉出一列,在首行传入该函数后,复制到每一行,可拉取对应列的数据,并转换为 sql 语句。
1 | =CONCATENATE("INSERT INTO table_name (list_1,list_2,list_3) VALUES ('",A1,"','",B1,"','",C1,"');") |
Python 批量处理 Excel
1 | import pymysql |
python 复制文件
1 | shutil.copy(src, dst) |
python 字符串处理
1 | # 将变量转化成字符串类型 |
python 字典的遍历
1 | # keys() 该方法会返回字典的所有的key |
python解析json字符串
1 | d = json.loads(req.text) |
python常用的去重方式
对列表去重
**1.**用循环查找的方式
1 | li = [1,2,3,3,4,2,3,4,5,6,1] |
**2.**用集合的特性set()
1 | li1 = [1,4,3,3,4,2,3,4,5,6,1] |
**3.**使用itertools模块的grouby方法
1 | import itertools |
**4.**运用while循环遍历的方式
1 | def quchong(lb): |
**5.**使用keys()方式
1 | li4 = [1,0,3,7,7,5] |
对数据框去重
**1.**用unique()对单属性列去重
1 | import pandas as pd |
**2.**用frame.drop_duplicates()对单属性列去重
1 | data.drop_duplicates(['id']) |
**3.**用frame.drop_duplicates()对多属性列去重
1 | data.drop_duplicates(['id','age']) |
**4.**用frame.duplicated()对多属性列去重
1 | isduplicated = data.duplicated(['id','age'],keep='first') |
python 查找列表中重复元素以及重复元素的次数
1 | from collections import Counter |
方法一:
1 | mylist = [1,2,2,2,2,3,3,3,4,4,4,4] |
1 | the 1 has found 1 |
方法二:
1 | from collections import Counter |
1 | Counter({2: 4, 4: 4, 3: 3, 1: 1}) |
方法三:
1 | List=[1,2,2,2,2,3,3,3,4,4,4,4] |
python print 格式化输出
动态指定长度的实现
1 | # print %s固定长度格式输出: |
以指定宽度格式化输出(format)
1 | mat = "{:20}\t{:28}\t{:32}" |
python Set(集合)相关函数操作
<返回目录>
python的set
和其他语言类似, 是一个无序不重复元素集。基本功能包括关系测试和消除重复元素。集合对象还支持union(联合)
, intersection(交)
, difference(差)
和sysmmetric difference(对称差集)
等数学运算。
set
支持 x in set
, len(set)
, 和 for x in set
。作为一个无序的集合,set
不记录元素位置或者插入点。因此,set
不支持 indexing
, slicing
, 或其它类序列sequence-like
的操作。
1 | s = set() |
Markdown 技能分享
<返回目录>
Markdown是一种轻量级的「标记语言」
Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式。它允许人们使用易读易写的纯文本格式编写文档,然后转换成格式丰富的HTML页面,Markdown文件的后缀名便是“.md”
Markdown增强版中比较有名的有Markdown Extra、MultiMarkdown、 Maruku等。这些衍生版本要么基于工具,如
Pandoc,Pandao;要么基于网站,如GitHub和Wikipedia,在语法上基本兼容,但在一些语法和渲染效果上有改动。
Markdown的功能列表演示
1 | # 标题H1 |
标题H1
1 | ## 标题H2 |
标题H2
1 | ### 标题H3 |
标题H3
1 | #### 标题H4 |
标题H4
1 | ##### 标题H5 |
标题H5
1 | ###### 标题H6 |
标题H6
字符效果和横线等
1 | ---- |
1 | ~~删除线~~ <s>删除线(开启识别HTML标签时)</s> |
删除线 删除线(开启识别HTML标签时)
1 | *斜体字* _斜体字_ |
斜体字 斜体字
1 | **粗体** __粗体__ |
粗体 粗体
1 | ***粗斜体*** ___粗斜体___ |
粗斜体 粗斜体
1 | 上标:X<sub>2</sub>,下标:O<sup>2</sup> |
上标:X2,下标:O2
缩写(同HTML的abbr标签)
即更长的单词或短语的缩写形式,前提是开启识别HTML标签时,已默认开启
1 | The <abbr title="Hyper Text Markup Language">HTML</abbr> specification is maintained by the <abbr title="World Wide Web Consortium">W3C</abbr>. |
The HTML specification is maintained by the W3C.
引用 Blockquotes
1 | > 引用文本 Blockquotes |
引用文本 Blockquotes
引用的行内混合 Blockquotes
1 | > 引用:如果想要插入空白换行`即<br />标签`,在插入处先键入两个以上的空格然后回车即可,[普通链接](https://www.mdeditor.com/)。 |
引用:如果想要插入空白换行
即<br />标签
,在插入处先键入两个以上的空格然后回车即可,普通链接。
锚点与链接 Links
1 | [普通链接](https://www.mdeditor.com/) |
普通链接
普通链接带标题
直接链接:https://www.mdeditor.com
[锚点链接][anchor-id]
[anchor-id]: https://www.mdeditor.com/
mailto:test.test@gmail.com
GFM a-tail link @pandao
邮箱地址自动链接 test.test@gmail.com www@vip.qq.com
@pandao
多语言代码高亮 Codes
行内代码 Inline code
1 | 执行命令:`npm install marked` |
执行命令:npm install marked
缩进风格
即缩进四个空格,也做为实现类似 <pre>
预格式化文本 ( Preformatted Text ) 的功能。
<?php
echo "Hello world!";
?>
预格式化文本:
| First Header | Second Header |
| ------------- | ------------- |
| Content Cell | Content Cell |
| Content Cell | Content Cell |
JS代码
1 | function test() { |
HTML 代码 HTML codes
1 |
|
图片 Images
图片加链接 (Image + Link):
Follow your heart.
列表 Lists
无序列表(减号)Unordered Lists (-)
- 列表一
- 列表二
- 列表三
无序列表(星号)Unordered Lists (*)
- 列表一
- 列表二
- 列表三
无序列表(加号和嵌套)Unordered Lists (+)
- 列表一
- 列表二
- 列表二-1
- 列表二-2
- 列表二-3
- 列表三
- 列表一
- 列表二
- 列表三
有序列表 Ordered Lists (-)
- 第一行
- 第二行
- 第三行
GFM task list
- GFM task list 1
- GFM task list 2
- GFM task list 3
- GFM task list 3-1
- GFM task list 3-2
- GFM task list 3-3
- GFM task list 4
- GFM task list 4-1
- GFM task list 4-2
绘制表格 Tables
项目 | 价格 | 数量 |
---|---|---|
计算机 | $1600 | 5 |
手机 | $12 | 12 |
管线 | $1 | 234 |
First Header | Second Header |
---|---|
Content Cell | Content Cell |
Content Cell | Content Cell |
First Header | Second Header |
---|---|
Content Cell | Content Cell |
Content Cell | Content Cell |
Function name | Description |
---|---|
help() |
Display the help window. |
destroy() |
Destroy your computer! |
Left-Aligned | Center Aligned | Right Aligned |
---|---|---|
col 3 is | some wordy text | $1600 |
col 2 is | centered | $12 |
zebra stripes | are neat | $1 |
Item | Value |
---|---|
Computer | $1600 |
Phone | $12 |
Pipe | $1 |
特殊符号 HTML Entities Codes
1 | © & ¨ ™ ¡ £ |
© & ¨ ™ ¡ £
& < > ¥ € ®
± ¶ § ¦ ¯ « ·
X² Y³ ¾ ¼ × ÷ »
18ºC " '
Emoji表情 :smiley:
Blockquotes :star:
GFM task lists & Emoji & fontAwesome icon emoji & editormd logo emoji :editormd-logo-5x:
- :smiley: @mentions, :smiley: #refs, links, formatting, and
tagssupported :editormd-logo:; - list syntax required (any unordered or ordered list supported) :editormd-logo-3x:;
- [ ] :smiley: this is a complete item :smiley:;
- []this is an incomplete item test link :fa-star: @pandao;
- [ ]this is an incomplete item :fa-star: :fa-gear:;
反斜杠 Escape
*literal asterisks*
科学公式 TeX(KaTeX)
$$E=mc^2$$
行内的公式$$E=mc^2$$行内的公式,行内的$$E=mc^2$$公式。
$$x > y$$
$$(\sqrt{3x-1}+(1+x)^2)$$
$$\sin(\alpha)^{\theta}=\sum_{i=0}^{n}(x^i + \cos(f))$$
多行公式:
1 | \displaystyle |
1 | \displaystyle |
1 | f(x) = \int_{-\infty}^\infty |
分页符 Page break
Print Test: Ctrl + P
绘制流程图 Flowchart
1 | st=>start: 用户登陆 |
绘制序列图 Sequence Diagram
1 | Andrew->China: Says Hello |
End
git
1 | # git 免重复输入密码 |
git 撤销命令详解
修改最后一次commit的内容
文件修改后git add
了,也git commit
了,发现哪里错了或者是漏add
了一个文件,可以先git add file
后,再git commit –amend
这样只会记录一次commit
(相当于将两次commit
合并成了一次commit
)。
取消加入暂存区的文件
不小心用了git add .
将所有文件加入了暂存区或者是add
多了文件,可以使用git reset HEAD <file>
将文件拉回到已修改但是未提交到暂存区的状态。(在add
后,通过git status
可以看到相应提示,教你如何撤销提交)
取消对当前目录下文件的修改
不小心将文件改崩了,或者发现文件根本没必要修改,可以用git checkout — <file>
取消工作区的文件的修改。(同样的,在修改文件后,通过git status
可以看到相应提示)
reset 命令的3种模式
git reset –option <commitid>
是回滚命令,option 有三个参数可选:
git reset –mixed
,这也是默认方式(即不带参数默认是这种),回退暂存区和版本库信息,工作区的源码不会变化,可以重新add,重新commit。git reset –soft
,回退版本库信息,暂存区和工作区都不会变化,如果还要提交,直接commit即可。git reset –hard
,彻底回退,3个区都回退到历史某个版本。
回滚某个文件
git log –pretty=oneline <file>
可以查看某个文件的修改历史。git show commit_id <file>
可以查看对应某个commit
时期file
的内容。git reset commit_id <file>
可以将file
回退到某个版本- 执行完第3步后提示:
1
2Unstaged changes after reset:
M README.md
执行git status
,提示:
1 | Changes to be committed: |
执行git checkout — <file>
后,README.md成功回滚到指定版本。
git 去掉多余的commit
1 | git rebase -i <commit_ID> |
git commit 技巧
1 | git commit -s -m |
linux/Unix
访问本机接口
1 | curl --location --request POST 'http://本机IP/接口' --header 'Content-Type: application/x-www-form-urlencoded' --data-urlencode 'data=[{"type":1,"brand":"GE","ae_oe_code":"9261317"}]' |
查看 log 技巧
1 | tail -f <file> i//自动刷新查看文件,适用于查看日志,相对于cat的优点在于不用全部打开,只会看最新的几行,看大文件时不会那么容易卡死 |
vim 常用快捷键
1 | $ |
homebrew
brew 相关命令
1 | 更新:brew update |
brew 应用包
1 | tree |
oh-my-zsh
1 | git |