0%

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 拉所有分支
git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
git fetch --all
git pull --all

# 删除旧源
git remote rm origin

# 改为新源
git remote add origin git@xxxx.com

# 推代码 全部分支 / 标签
git push --all
git push --tags

1. 创建用户

1
2
3
4
5
# 创建用户, -m 创建用户家目录
useradd -m 用户名

# 修改密码(在root用户下操作)
passwd 用户名

2. 在git项目服务器添加ssh公钥

3. 在部署服务器用户家目录添加ssh密钥

1
2
3
4
5
6
7
8
mkdir ~/.ssh/
vi id_rsa # 添加公钥
vi id_rsa.pub # 添加私钥

# 如果提示权限644不对(Permissions 0644 for '~/.ssh/id_rsa' are too open) 执行以下命令修改权限
chmod 755 ~/.ssh/
chmod 600 ~/.ssh/id_rsa ~/.ssh/id_rsa.pub
chmod 644 ~/.ssh/known_hosts

VSCode常用快捷键

  • 全部折叠: cmd + k + cmd + 0

注:

关于导包

  • PyCharm 可以在项目指定目录右键指定为导包路径, VSCode需要在.vscode/launch.jsonsettings.configurations 配置env时加上 "PYTHONPATH": "${fileDirname}/../smartbase:${fileDirname}"多个目录通过 : 追加

download

  • Windows10下载MinGW
  • 点击页面中的x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z 进行下载
  • 下载完成后把 bin 目录放入系统环境变量即可在终端使用 c++ 命令进行编译 .cpp 源代码

Hello World

  • MyFirstApp
1
2
3
4
5
6
#include <iostream>

int main(){
std::cout << "Hello World! \n"; // this will output to the console hello world
system("pause>0");
}
1
2
3
4
5
# 编译
g++ .\MyFirstApp.cpp

# 运行
.\a.exe
  • 换行 \n << endl;

  • 编译命令 g++ [source file] -o [output filename]

Variables

  • 命名
    • 构成: 下划线, 字母(区分大小写), 数字(不可数字开头)
    • 一般用小驼峰命名法

Data types

类型 定义 size(bytes) 说明
整数 int 4 -2147483648 to 2147483647
字符 char 1 单引号为字符 ‘a’
字符串 string 双引号为字符串 “character”
布尔 bool 1 true / false
浮点数 float 4
大浮点数 double 8

Data type overflow

  • 变量的值超过其内存空间, 类似钟表指针, 13 点 = 1 点 (INT_MAX + 1 = INT_MIN)

ASCII table

  • asign characters to number (it’s for American)
  • ASCII extends: utf-(1-16) (for others)
  • 字符转换为ASCII数字 (int)'a'int('a') 两种写法

Condition Statement

语法

if(){}elif(){}else(){}

  • 注: 如果 {} 内只有一行代码, 可以不写 {}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
using namespace std;

int main(int argc, char const *argv[])
{
//User enters side lengths of a triangle (a, b, c)
//Program should write out whethre that triangle is
//equilateral, isosceles or scalene
float a, b, c;
cout << "a, b, c: ";
cin >> a >> b >> c;

if (a == b && b == c)
cout << "Equilateral triangle";
else
{
if (a != b && a != c && b != c)
cout << "Scalene triangle";
else
cout << "Isosceles triangle";
}

return 0;
}

Operators

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <iostream>
using namespace std;

int main(int argc, char const *argv[])
{
// 执行优先级 从上到下
// + - * / %
cout << 1 + 1 << endl;
cout << 5 / 2 << endl; // 2
cout << 5.0 / 2 << endl; // 2.5

// ++, --
int counter = 7;
counter++;
cout << counter << endl;
counter--;
cout << counter << endl;

int counter2 = 7;
cout << counter2++ << endl; // 7
cout << counter2 << endl; // 8
cout << ++counter2 << endl; // 9

system("cls"); // clear console

// <, >, <=, >=, ==, !=
int a = 5, b = 5;
// cout << (a > b) << endl; // 0 for false (1 for true)

// &&, ||, !
int c = 8, d = 9;
// cout << !(c == 5 && b == 9);

// 优先级
cout << (c == 8 && d == 4 + 5); // 1

// =, +=, -=, *=, /=, %=
int x = 5;
x += 7; //same as: x = x + 7
cout << x << endl;

return 0;
}

三目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
using namespace std;

int main(int argc, char const *argv[])
{
int hostUserNum, guestUserNum;
cout << "HOST: ";
cin >> hostUserNum;
system("cls");
cout << "Guest: ";
cin >> guestUserNum;

(hostUserNum == guestUserNum)? cout << "Correct!": cout << "Failed!";

return 0;
}

switch case

注意每个case后面必需接break退出, 因为程序只判断一次case条件, 进入一次后, 其他的case不会再判断, 会运行下面的所有case.

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
26
27
28
29
30
31
32
33
34
#include <iostream>
using namespace std;

int main(int argc, char const *argv[])
{
float num1, num2;
char operation;
cout << "Caculator" << endl;
cin >> num1 >> operation >> num2;

switch (operation)
{
case '-':cout << num1 << operation << num2 << "=" << num1 - num2;
break;
case '+':cout << num1 << operation << num2 << "=" << num1 + num2; break;
case '*':cout << num1 << operation << num2 << "=" << num1 * num2; break;
case '/':cout << num1 << operation << num2 << "=" << num1 / num2; break;
case '%':
bool isNum1Int, isNum2Int;
isNum1Int = (int(num1) == num1);
isNum2Int = (int(num2) == num2);

if (isNum1Int && isNum2Int)
cout << num1 << operation << num2 << "=" << int(num1) % int(num2);
else
cout << "Not valid!";

break;

default:cout << "Not valid opeation!"; break;
}

return 0;
}

源码安装Mysql

系统: CentOS 8

1. 下载

官网找指定版本下载源码包

https://downloads.mysql.com/archives/community/

1
wget https://downloads.mysql.com/archives/get/p/23/file/mysql-boost-5.7.34.tar.gz

2. 解压编译

1
2
3
4
5
6
7
8
9
10
11

# 解压
tar -zvxf mysql-boost-5.7.34.tar.gz
cd mysql-5.7.34

# 安装cmake
yum install cmake

# 编译
cmake .

编译时命令 cmake . 报错汇总

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 报错: undefined symbol: archive_write_add_filter_zstd
yum install libarchive

# 报错: No CMAKE_CXX_COMPILER could be found.
yum install gcc-c++

# 报错: CMake Error at cmake/boost.cmake:88, 根据提示命令增加额外安装boost目录
# (也可自行下载安装Boost C++ 下载地址: https://sourceforge.net/projects/boost/files/boost/)
# 注意 只能是1.59.0版本的boost
mkdir -p /usr/local/boost

cmake -DDOWNLOAD_BOOST=1 -DWITH_BOOST=/usr/local/boost .
#
cd /usr/local/boost
wget https://udomain.dl.sourceforge.net/project/boost/boost/1.59.0/boost_1_59_0.tar.gz
tar -zvxf boost_1_59_0.tar.gz
cmake . -DDOWNLOAD_BOOST=1 -DWITH_BOOST=/usr/local/boost/boost_1_59_0

# 报错: CMake Error at cmake/ssl.cmake:63 (MESSAGE): Please install the appropriate openssl developer package
gg


二进制安装

1. 下载

https://downloads.mysql.com/archives/community/

Operating System: Linux-Generic

OS Version: Linux-Generic(glibc 2.12) (x86, 64-bit)

1
wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.34-linux-glibc2.12-x86_64.tar.gz

2. 安装

先查看下系统磁盘绑定情况, 再决定mysql data目录

命令: df -h

2.1. 创建用户, 用户组, 数据目录

1
2
3
groupadd mysql
useradd -g mysql -d /home/mysql mysql
mkdir /home/mysql/data

2.2. 下载, 解压

1
2
3
cd /home/mysql
wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.34-linux-glibc2.12-x86_64.tar.gz
tar -zvxf mysql-5.7.34-linux-glibc2.12-x86_64.tar.gz

2.3. 配置启动

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# 初始化配置
./mysqld --user=mysql --basedir=/home/mysql --datadir=/home/mysql/data --initialize

# 修改basedir, datadir
vim support-files/mysql.server
--------------------------
...
basedir=/home/mysql
datadir=/home/mysql/data
...
--------------------------

# 创建软链接使命令可全局使用
ln -s /home/mysql/bin/mysql /usr/bin/mysql

# 创建配置文件
vi /etc/my.cnf
--------------------------
...
[mysqld]

basedir = /home/mysql
datadir = /home/mysql/data

character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect = 'SET NAMES utf8mb4'

[mysql]
default-character-set = utf8mb4

[client]
default-character-set=utf8mb4
...
--------------------------

# 添加开机启动
cp /home/mysql/support-files/mysql.server /etc/init.d/mysqld

# 增加可执行权限
chmod 755 /etc/init.d/mysqld

# 查看开机启动列表是否有mysqld, 没有就根据提示添加
chkconfig --list mysqld
chkconfig --add mysqld

# 启动mysql
./support-files/mysql.server start

# 首次进入mysql 并修改root密码
mysql -uroot -p
> alter user user() identified by "修改的密码";

# 查看默认编码集
show variables where variable_name like '%char%' or variable_name like 'collation%';
+--------------------------+-----------------------------+
| Variable_name | Value |
+--------------------------+-----------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| character_sets_dir | /home/mysql/share/charsets/ |
| collation_connection | utf8mb4_unicode_ci |
| collation_database | utf8mb4_unicode_ci |
| collation_server | utf8mb4_unicode_ci |
+--------------------------+-----------------------------+

# systemctl 显示mysqld退出但实际没退出时
systemctl daemon-reload

启动mysql可能出现的错误:

1
2
3
4
5
6
7
8
# error while loading shared libraries: libncurses.so.5 
# error while loading shared libraries: libtinfo.so.5
# 提示缺少依赖libncurses.so.5 和 libtinfo.so.5
# 但在 /usr/lib64 目录下是有 libtinfo.so.6.1 和 libncurses.so.6.1包的
# 所以只需创建个软链接让mysql启动时去找到 *.5的包但实际是调用 *.6.1的包即可

sudo ln -s /usr/lib64/libncurses.so.6.1 /usr/lib64/libncurses.so.5
sudo ln -s /usr/lib64/libtinfo.so.6.1 /usr/lib64/libtinfo.so.5

一. 基础

1. 性能指标

速率

  • 即数据率或称数据传输率或比特率
速率(千,兆,吉,太)(kb, Mb, Gb, Tb) 存储容量(KB, MB, GB, TB)(1Byte = 8bit)
千 1kb/s = 10**3 b/s 1KB = 2**10B = 1024B = 1024 * 8 b

带宽

  • 指网络的通信线路传送数据的能力, 通常是指单位时间内从网络中的一点到另一点所能通过的 最高数据率
  • 单位: 比特每秒, b/s, kb/s, Mb/s, Gb/s, 网络设备所支持的最高速度

吞吐量

  • 表示单位时间 内通过 **某个网络(或信道、接口)**的数据量
  • 单位: b/s, kb/s, Mb/s等
  • 吞吐量受网络的带宽或网络的额定速率的限制

时延

  • 指数据(报文/分组/比特流)从网络(或链路)的一端传送到另一端所需的时间,也叫延迟,单位s

    • 发送时延(传输时延):从发送分组的第一个比特算起, 到该分组的最后一个比特发送完毕所需的时间

$$
发送时延 = \frac{数据长度}{信道带宽}
$$

  • 传播时延:取决于电磁波的传播速度和链路长度

$$
传播时延 = \frac{信道长度}{3 * 10^8}
$$

  • 排队时延:等待输出/输入链路可用
  • 处理时延:检错、找出口

时延带宽积

  • 又称为 以比特为单位的链路长度, 即 某段链路现在有多少比特, 是指链路中某一时刻的比特容量

$$
时延带宽积(bit) = 传播时延(s) \times 带宽 (b/s)
$$

往返时间RTT

  • 从发送方发送数据开始, 到发送方收到接收方的确认(接收方收到数据后立即发送确认),总共经历的时延
    • 如 ping 的time = 33ms
  • RTT越大,在收到确认之前,可以发送的数据越多
  • RTT包括
    • 往返传播时延 = 传播时延 * 2
    • 末端处理时间

利用率

  • 信道利用率

$$
信道利用率 = \frac{有数据通过时间}{(有+无)数据通过时间}
$$

  • 网络利用率: 信道利用率加权平均值

加权平均值即将各数值乘以相应的权数,然后加总求和得到总体值,再除以总的单位数。加权平均值的大小不仅取决于总体中各单位的数值(变量值)的大小,而且取决于各数值出现的次数(频数),由于各数值出现的次数对其在平均数中的影响起着权衡轻重的作用,因此叫做权数。

2. 分层结构

  • 实体:第n层中的活动元素称为 n层实体。同一层的实体叫 对等实体
  • 协议:为进行网络中的 对等实体 数据交换而建立的规则、标准或约定称为网络协议。
  • 接口(访问服务点SAP): 上层使用下层服务的入口。
  • 服务:下层为相邻上层提供的功能调用。

2.1. OSI参考模型

目的:支持 异构网络系统 的互联互通。

国际标准化组织(ISO) 于1984年提出开放系统互连(OSI)参考模型。

OSI 七层 说明
应用层 数据子网(数据处理)
表示层 数据子网(数据处理)
会话层 数据子网(数据处理)
传输层
网络层 通信子网(数据通信)
数据链路层 通信子网(数据通信)
物理层 通信子网(数据通信)
  • 应用层
    • 定义:所有能和用户交互产生网络流量的程序
    • 典型应用层服务:
      • 文件传输:FTP
      • 电子邮件:SMTP
      • 万维网:HTTP
  • 表示层
    • 定义:用于处理在两个通信系统中交换信息的表示方式(语法和语义)
    • 功能:
      • 数据格式变换
      • 数据加密解密
      • 数据压缩和恢复
  • 会话层
    • 定义:向表示层实体/用户进程提供建立连接并在连接上有序地传输数据。这是会话, 也是建立同步(SYN)
    • 功能:
      • 建立、管理、终止会话
      • 使用校验点可使会话在通信失效时从 校验点/同步点 继续恢复通信,实现数据同步。(适用于传输大文件)
  • 传输层
    • 定义:负责该机中 两个进程 的通信,即端到端 的通信。传输意念是报文段或用户数据报。
    • 功能:
      • 可靠传输、不可靠传输
        • 可靠:先建立连接,确认机制,如握手,再传输数据
        • 不可靠:无建立连接,直接传数据
      • 差错控制
      • 流量控制
      • 复用分用
        • 复用:多个应用层进程可同时使用下面传输层的服务
        • 分用:运输层把收到的信息分别交付给上面应用层中相应的进程
  • 网络层
    • 定义:主要任务是把分组从源端传到目的端,为分组交换网上的不同该机提供通信服务。网络层传输单位是数据报
    • 功能:
      • 路由选择:最佳路径
      • 流量控制:限制发送端
      • 差错控制
      • 拥塞控制:若所有结点都来不及接受分组,而要丢弃大量分组的话,网络就处于拥塞状态。因此要采取一定措施,缓解这种拥塞。
  • 数据链路层
    • 定义:主要任务是把网络层传下来的数据报组装成帧。传输单位是帧。
    • 功能:
      • 成帧(定义帧的开始和结束)
      • 差错控制:帧错+位错
      • 流量控制:限制发送端速度
      • 访问(接入)控制:控制对信道的访问
  • 物理层
    • 定义:主要任务是在物理媒体上实现比特流的透明传输。传输单位是比特。
    • 透明传输:指不管所传数据是什么样的比特组合,都应当能够在链路上传送。
    • 功能:
      • 定义接口特性
      • 定义传输模式
        • 单工、半双工、双工
      • 定义传输速率
      • 比特同步
      • 比特编码:用什么电压表示1, 什么电压表示0

2.2. TCP/IP模型

TCP/IP 四层 协议栈
应用层 HTTP,FTP,DNS,SMTP
传输层 TCP,UDP
网际层 IP
网络接口层 Ethernet, ATM, Frame Relay

2.3. OSI与TCP/IP对比

  • 相同点
    • 都分层
    • 基于独立的协议栈的概念
    • 可以实现异构网络互联
  • 不同点
    • OSI定义三点:服务、协议、接口
    • OSI先出现,参考模型先于协议发明,不偏向特定协议
    • TCP/IP设计之初就考虑到异构网互联问题,将IP作为重要层次
OSI TCP/IP
网络层 无连接 + 面向连接 无连接
传输层 面向连接 无连接 + 面向连接

面向连接分为三个阶段:

  1. 建立连接,在此阶段,发出一个建立连接的请求。
  2. 只有连接成功建立之后,才能开始传输数据, 这是第二阶段
  3. 当数据传输完毕必须释放连接

无连接直接进行数据传输

2.4. 5层参考模型

5层参考模型 说明 协议
应用层 支持各种网络应用 FTP、SMTP、HTTP
传输层 进程-进程的数据传输 TCP、UDP
网络层 源主机到目的主机的数据分组路由与转发 IP、ICMP、OSPF
数据链路层 把网络层传下来的数据报组装成帧 Ethernet、PPP
物理层 比特传输

3. 通信基础

物理层基本概念

  • 物理层解决如何在连接各种计算机的传输媒体上传输数据比特流, 而不是指具体的传输媒体
  • 主要任务: 确定与传输媒体接口有关的一些特性
  • 机械特性:
  • 电气特性:
  • 功能特性:

数据通信基础

image-20210622135226744

  • 数据: 传送信息的实体, 通常是有意义的符号序列
  • 信号: 数据的电气/电磁的表现, 是数据在传输过程中的存在形式
    • 数字信号: 代表消息的参数取值是离散的
    • 模拟信号: 代表消息的参数取值是连续的 (正弦波)
  • 信源: 产生和发送数据的源头
  • 信宿: 接收数据的终点
  • 信道:
    • 按传输信号分类:
  • 三种通信方式:
    • 单工通信

1. 下载对应包

https://github.com/fatedier/frp/releases

在git上找到对应自己系统版本的链接, 并下载到服务器

例:

wget https://github.com/fatedier/frp/releases/download/v0.37.0/frp_0.37.0_linux_386.tar.gz

2. 解压缩

tar -zvxf frp_0.37.0_linux_386.tar.gz

3. 修改服务器配置

后台运行: nohup ./frps -c frps.ini >/dev/null 2>&1 &

bind_port FRP使用端口

v_host_http_port 外部访问端口(可配置nginx proxy_pass转发)

  • vi frps.ini
1
2
3
4
[common]
bind_port = 7000
token = 12345678
vhost_http_port = 80
  • 启动: ./frps -c frps.ini

4. 修改客户端配置

客户端下载同服务端

  • vi frpc.ini
1
2
3
4
5
6
7
8
9
10
[common]
server_addr = 106.14.30.129
server_port = 7000
token = 12345678
tls_enable = true

[krkdwc]
type = http
custom_domains = dev.bogwang.cn
local_port = 5000
  • 启动: ./frpc -c frpc.ini

Oracle 字符串只能用单引号

mac安装通过docker安装使用oracle

参考: https://github.com/MaksymBilenko/docker-oracle-12c

1
2
3
4
5
6
7
8
9
10
11
12
13
# 拉取镜像
docker pull quay.io/maksymbilenko/oracle-12c

# 创建容器并运行
docker run -d -p 8080:8080 -p 1521:1521 --name=oracle quay.io/maksymbilenko/oracle-12c

# 连接配置
hostname: localhost
port: 1521
sid: xe
service name: xe
username: system
password: oracle

基操

  • 查看数据库版本: select * from v$version;

用户

  • 创建用户: create user 用户名 identified by 密码
    • 例: create user test identified by test

第一次创建create user 'root' identified by '123456'

提示 missing user or role name 是因为此处用户名不需要引号

修改后提示无效密码, 同样密码也不需要引号

  • 修改密码: alter user 用户名 identified by 新密码

角色

oracle为兼容以前版本,提供三种标准角色(role):connect, resource和dba.

  1. connect role(连接角色)

–临时用户,特指不需要建表的用户,通常只赋予他们connect role.

–connect是使用oracle简单权限,这种权限只对其他用户的表有访问权限,包括select/insert/update和delete等。

–拥有connect role 的用户还能够创建表、视图、序列(sequence)、簇(cluster)、同义词(synonym)、回话(session)和其他 数据的链(link)

  1. resource role(资源角色)

–更可靠和正式的数据库用户可以授予resource role。

–resource提供给用户另外的权限以创建他们自己的表、序列、过程(procedure)、触发器(trigger)、索引(index)和簇(cluster)。

  1. dba role(数据库管理员角色)

–dba role拥有所有的系统权限

–包括无限制的空间限额和给其他用户授予各种权限的能力。system由dba用户拥有

除了前面三种系统角色—-connect、resource和dba,用户还可以在oracle创建自己的role。

用户创建的role可以由表或系统权限或两者的组合构成。

为了创建role,用户必须具有create role系统权限。

  1. 创建角色: create role 角色名;

  2. 授权角色: grant select on 表名 to 角色名;

  3. 删除角色: drop role 角色名;

权限

  • 授权: grant connect, resource to 用户名;
  • 撤消: revoke connect, resource from 用户名;

库表

创建表时提示: no privileges on tablespace USERS

执行: alter user 库名 quota unlimited on users;

  • 创建数据库: create tablespace 表间名 datafile '数据文件名' size 表空间大小;
    • 例: create tablespace TEST datafile 'test' size 20M;
  • 查看建表语句: select dbms_metadata.get_ddl('TABLE','USERINFO') from dual;

错误汇总

  • 找不到 libocci.dylib

参考: https://cx-oracle.readthedocs.io/en/latest/user_guide/installation.html 根据提示要安装 Oracle Instant Client

下载 http://www.oracle.com/technetwork/topics/intel-macsoft-096467.htmlBasic Package

下载解压后在环境变量中添加 export DYLD_LIBRARY_PATH=解压文件目录

  • ORA-12541

服务未启动

  • ORA-12505

报错时的配置: oracle+cx_oracle://test:123456@localhost:1521/TEST

连接配置不是具体到库, 而是到服务名, 修改为: oracle+cx_oracle://test:123456@localhost:1521/xe

服务名查看命令: select INSTANCE_NAME from v$instance;

[TOC]

flask-cookiecutter-restful 使用

一. 本地开发准备

1. 源码安装python-3.7.10

1
2
3
4
wget -c https://www.python.org/ftp/python/3.7.10/Python-3.7.10.tar.xz
tar -zxvf Python-3.7.10.tar.xz
cd Python-3.7.10/Modules
vim Setup.dist

搜索:

1
:/ssl

将以下内容取消注释:

1
2
3
4
5
6
7
8
# Socket module helper for socket(2)
#_socket socketmodule.c
# Socket module helper for SSL support; you must comment out the other
# socket line above, and possibly edit the SSL variable:
#SSL=/usr/local/ssl
#_ssl _ssl.c \
# -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
# -L$(SSL)/lib -lssl -lcrypto

取消注释如下:

1
2
3
4
5
6
7
8
# Socket module helper for socket(2)
_socket socketmodule.c
# Socket module helper for SSL support; you must comment out the other
# socket line above, and possibly edit the SSL variable:
#SSL=/usr/local/ssl
_ssl _ssl.c \
-DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
-L$(SSL)/lib -lssl -lcrypto

返回Python源码根目录编译安装:

1
2
3
4
cd ../
./configure --prefix=/usr/local/python3.7.10 --enable-loadable-sqlite-extensions
make
make install

将 /usr/local/python3.6/bin 加入 PATH, 在/etc/profile文件后追加:

1
vim /etc/profile

追回内容如下:

1
export PATH=/usr/local/python3.7/bin:$PATH

设置python, pip别名:

1
vim ~/.bashrc

内容如下:

1
2
alias python3.7=/usr/local/python3.7.10/bin/python3
alias pip3.7=/usr/local/python3.7.10/bin/pip3

2. 使用cookiecutter创建项目

1
2
3
pip install cookiecutter

cookiecutter https://github.com/karec/cookiecutter-flask-restful

3. pipenv 创建虚拟环境

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 安装
pip install pipenv

# 更新
pip install --user --upgrade pipenv

# 指定Python版本创建虚拟环境
pipenv --python 3.7

# 进入虚拟环境
pipenv shell

# 安装包
pipenv install
#
pipenv install -r requirements.txt

4. 数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 本地创建相关库
CREATE DATABASE `aipms` /*!40100 DEFAULT CHARACTER SET utf8mb4 */

# 项目配置数据库, 修改.env
DATABASE_URI=mysql+pymysql://root:123456@localhost:3306/aipms?charset=utf8mb4

# 进虚拟环境
pipenv shell

# 生成迁移文件
flask db migrate -m 'init migration'

# 更新到数据库
flask db upgrate

5. 接口测试

  • 注册

    1
    2
    3
    4
    5
    6
    curl --location --request POST 'http://127.0.0.1:5002/auth/register' \
    --header 'Content-Type: application/json' \
    --data-raw '{
    "username": "admin",
    "password": "admin"
    }'
  • 登录

    1
    2
    3
    4
    5
    6
    curl --location --request POST 'http://127.0.0.1:5002/auth/login' \
    --header 'Content-Type: application/json' \
    --data-raw '{
    "username": "admin",
    "password": "admin"
    }'

6. git

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# git初始化
git init

# 添加源
git remote add origin git@*****

# 拉取代码, 有冲突解决冲突
git pull

# 切换新分支
git checkout -b feature-init

# add 所有
git add .

# commit
git commit -m 'init'

# 分支推送到远程库
git push --set-upstream origin feature-init

二. 部署

1. gunicorn

1
pipenv install gunicorn

2. docker

  • 安docker
1
brew install docker
  • 安docker-compose
1
python3 -m pip install docker-compose
  • 登录docker

    1
    docker login
  • 拉取基础Image

    1
    docker pull python:3.7.10-alpine
  • 创建容器并进入

    1
    docker run -it --name=container_name python:3.7.10-alpine /bin/sh
  • 配置dockerfile

    1

  • 从dockerfile启动项目

    1
    docker build -t container_name ./Dockerfile

Flask-Migrate + pgsql 执行报错psycopg2.errors.DuplicateTable: relation “user” already exists

问题出现: 全新项目, 本来是打算用mysql, 后来换pgsql, 一开始用mysql时执行过 flask db migrate / flask db upgrade, 测试ORM,, 换成pgsql后再执行flask db upgrade出现如上报错, 看字面意思是表已存在, 可pgsql中并没有此表!

原因: 一开始执行 flask db migrate 时 alembic 已经创建了记录(versions目录下的.py文件), 也就是说对 alembic 来说是已经创建过数据表了, 在sql语句执行前就被报错拦截住了, 所以即使数据库没有user表, 报错也提示表已存在!

解决: 直接把 versions 目录下记录全部删除, 重新执行 flask db upgrade