virtualenv

创建virtualenv时候遇到这个问题:

1
2
3
4
5
6
7
8
kevin@duguangtingdeMacBook-Pro:~ $ virtualenv myblog_env --python=python3
Running virtualenv with interpreter /Users/kevin/anaconda/bin/python3
Using base prefix '/Users/kevin/anaconda'
New python executable in /Users/kevin/myblog_env/bin/python3
Not overwriting existing python script /Users/kevin/myblog_env/bin/python (you must use /Users/kevin/myblog_env/bin/python3)
ERROR: The executable /Users/kevin/myblog_env/bin/python3 is not functioning
ERROR: It thinks sys.prefix is '/Users/kevin' (should be '/Users/kevin/myblog_env')
ERROR: virtualenv is not compatible with this system or executable

这个问题的原因是没有用系统级的Python,建立virtualenv的时候指定-p参数:virtualenv -p python3 myblog_env

还是用PyCharm建立虚拟环境比较方便。。。

flask-migrate数据库迁移

终于算是弄明白了数据库迁移是怎么做到的,使用flask-migrate先init形成迁移数据库吧,然后检测到数据模型有改变,这时候使用python manage.py db migrate形成迁移脚本,然后python manage.py db upgrade或者python manage.py db downgrade

另外有一点sqlite3貌似不支持删除列,所以要在migrations文件夹下修改env.py文件,加上render_as_batch=True

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
def run_migrations_online():
"""Run migrations in 'online' mode.
In this scenario we need to create an Engine
and associate a connection with the context.
"""
# this callback is used to prevent an auto-migration from being generated
# when there are no changes to the schema
# reference: http://alembic.readthedocs.org/en/latest/cookbook.html
def process_revision_directives(context, revision, directives):
if getattr(config.cmd_opts, 'autogenerate', False):
script = directives[0]
if script.upgrade_ops.is_empty():
directives[:] = []
logger.info('No changes in schema detected.')
engine = engine_from_config(config.get_section(config.config_ini_section),
prefix='sqlalchemy.',
poolclass=pool.NullPool)
connection = engine.connect()
context.configure(connection=connection,
target_metadata=target_metadata,
process_revision_directives=process_revision_directives,
render_as_batch=True,# this is new feature
**current_app.extensions['migrate'].configure_args)
try:
with context.begin_transaction():
context.run_migrations()
finally:
connection.close()

解决终端ssh时间久了卡掉的问题

/etc/ssh/ssh_config加上

1
2
ServerAliveInterval 60
ServerAliveCountMax 2

创建virtualenv不包含全局Python的包

virtualenv --no-site-packages -p python3 flask_env

配置服务器环境

Flask + uwsgi + nginx

配置nginx

vim /etc/nginx/sites-enabled/default这个是加入自己的配置,然后nginx的配置其实已经写好了,并且会引入这个自定义的配置。

1
2
3
4
5
6
7
8
9
10
11
12
server {
listen 80;
server_name 120.25.229.101;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8001;
uwsgi_param UWSGI_PYHOME /user/bin;
uwsgi_param UWSGI_CHDIR /root/skyrover;
uwsgi_param UWSGI_SCRIPT manage:app;
}
}

监听80端口,公网IP是这个,也可以使用域名。然后反向代理到uwsgi的127.0.0.1:8001上,uwsgi启动了这个app应用

vim /etc/nginx/nginx.conf这个是nginx的全局配置

uwsgi配置

使用pip3 install uwsgi

1
2
3
4
5
6
7
8
[uwsgi]
socket = 127.0.0.1:8001
chdir = /root/skyrover
wsgi-file = manage.py
callable = app
processes = 4
threads = 2
stats = 127.0.0.1:9191

启动的话:uwsgi config.ini

supervisor

这个应用可以启动应用,并且可以自动重启,安装好,配置如下,vim /etc/supervisor/conf.d/skyrover_supervisor.conf

1
2
3
4
5
6
7
[program:skyrover]
command=uwsgi /root/config.ini
directory=/root/skyrover
user=root
autostart=true
autorestart=true
stdout_logfile=/root/uwsgi_supervisor.log

每次更新代码之后service supervisor restart, service nginx restart, service uwsgi restart

pip安装慢的情况

添加~/.pip/pip.conf

1
2
3
4
5
6
7
[global]
timeout = 6000
index-url = http://pypi.douban.com/simple/
[install]
use-mirrors = true
mirrors = http://pypi.douban.com/simple/
trusted-host = pypi.douban.com

将本地的CSV文件插入到MySQL的方法以及遇到的问题~

load csv

LOAD DATA INFILE '/data/output.csv' INTO TABLE ability CHARACTER SET utf8 FIELDS TERMINATED BY ',';

存在的问题

  1. 使用utf8,而不是utf-8
  2. 插入的时候报错,ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
  3. 在load csv的时候出现表中有主键,但是csv数据没有那一列,会报错,doesn't contain data for all columns,于是用Python将每一行的行数加在csv文件的第一列。

这里要注意的是primary_key是从1开始,而不是0.

原因

secure_file_priv设置了指定目录,需要在指定的目录下进行数据导出

解决

mysql> show variables like '%secure%';

有一项是:secure_file_priv | /var/lib/mysql-files/ |

在这个文件夹下进行文件的读取与上传。

分割文件

在load的时候又出现了一个问题,这个文件夹所挂载的硬盘容量太小,文件copy不过来,于是采取了一种方法,将文件分割,命令:split,生成文件名为xaa,xab什么的

1
2
3
4
5
6
# 以文件行数分割,每个文件行数为1000行
split mylog -l 1000
# 以每个文件20M分割
split -b 20M logdata
# 以每个文件50MB指定前缀分割
split --bytes=50M logdata mydatafile

修改字段

load数据的时候遇到了这个问题,就是说out of range,于是修改为double(40,15)还是不行,后来发现此数据为2e+100,完全表示不下,于是使用字符串

alter table ability modify column shape_rate varchar(50)

合并表

由于有两台计算机上的数据,id标号不是连续的,先后插入的时候就会出现主键重复,现在准备采用分两个表插入,然后进行合并的方式:

insert into ability(fundId,ability_gain,ability_long,ability_medium,ability_risk,ability_short,ability_total,daily_profit,daily_profit_rate,date,fundbal,max_retracement,period_profit_rate,position_rate,shape_ratio,stk_maktval,ttimes_long,ttimes_medium,ttimes_short) select fundId,ability_gain,ability_long,ability_medium,ability_risk,ability_short,ability_total,daily_profit,daily_profit_rate,date,fundbal,max_retracement,period_profit_rate,position_rate,shape_ratio,stk_maktval,ttimes_long,ttimes_medium,ttimes_short from ability1;

另外一种解决方法是将第二个文件的第一个字段按照之前插入的最后一条的数字,相应进行更改,使用awk命令:

awk 'BEGIN{FS=",";OFS=",";ORS="\n";}{$1=NR+43146621;print $0}' datatest.txt > newdatatest.txt

FS:输入字段分隔符

RS:出入行分隔符

OFS:输出字段分隔符

ORS:表示输出行分隔符

整合一下,自动化:

lineNum=$(tail -1 /app/all_output_45/all_output.csv | awk -F ',' '{print $1}')

awk -v lineNum="$lineNum" 'BEGIN{FS=",";OFS=",";ORS="\n";}{$1=NR+lineNum;print $0}' all_output.csv > new_all_output.csv

所以要记录第一个文件的插入总条数,也就是插入后id值最后一个是什么

xaa:

xab:

xac:

关键问题

最后插入了很多数据后发现数据是21列,建的表是20列,晕,删除表,重新建表~

又出现一个问题,之前按照文件大小将文件分割,插入数据库的时候发现,文件最后一行完整性被损坏了,所以一定要按照行来分割数据文件~

split all_output.csv -l 46000000

VIM所有行替换:

:%s/fundid/fundId/gc

远程连接MySQL的时候,报错:

Can’t connect to MySQL server (10060)

这时候解决办法如下:

配置防火墙,开启3306端口,端口视情况而定

vi /etc/sysconfig/iptables

-A INPUT -m state –state NEW -m tcp -p tcp –dport 3306 -j ACCEPT(允许3306端口通过防火墙)

/etc/init.d/iptables restart(重启防火墙使配置生效)

检测方法,telnet 10.234.0.45 32768,如果进入界面,则说明链接成功,否则失败