大西洋暖流

一切都在不完美中前行


  • 首页

  • 关于

  • 标签

  • 归档

  • 搜索

成功解决pandas.DataFrame.to_sql写入MySQL报错1170问题!

发表于 2018-04-02 | 分类于 编程 | 阅读次数:
字数统计: 745 | 阅读时长 ≈ 3

(Photo by Nghia Le on Unsplash)

上周五遇到pandas.DataFrame.to_sql写入Mysql数据库报错1170问题(详见:pandas.DataFrame.to_sql写入MySQL报错1170),卡了我一整天;周六联系Tushare作者米哥,在用户交流群里,发帖求助,米哥给了一些建议,我尝试了一下,报错依然存在;周日查SQLAlchemy Reference,在想是不是哪个参数没用对,看得要吐血了还是没有眉目;晚上和一个朋友聊天,他说他现在只用PostgreSQL,完全不用MySQL……

这句话给了我灵感,我把数据库换成PostgreSQL,结果会怎样?

上午来公司,安装PostgreSQL,熟悉语法,配置完后,拿原来代码直接一跑,我靠,直接成功。PostgreSQL没有像MySQL那样,创建索引时要求TEXT类型必须指定长度,我心里暗爽,即使MySQL报错1170问题无法解决,我可以用PostgreSQL继续完成我的股票分析大业啊。

阅读全文 »

pandas.DataFrame.to_sql写入MySQL报错1170

发表于 2018-03-30 | 分类于 编程 | 阅读次数:
字数统计: 1,489 | 阅读时长 ≈ 7

(Photo by Fredrick Kearney Jr on Unsplash)

今天在使用pandas.DataFrame.to_sql这个接口,将Tushare获取的一个DataFrame写入MySQL时,出现如下报错。

PGM:writedb:write_records_into_mysql:error: (_mysql_exceptions.OperationalError) (1170, “BLOB/TEXT column ‘code’ used in key specification without a key length”) [SQL: u’CREATE INDEX ix_k_data_code ON k_data (code)’] (Background on this error at: http://sqlalche.me/e/e3q8)

这个错误在创建MySQL表时很常见,当键值字段是变长的BLOB或TEXT类型,MySQL引擎无法生成索引。

很遗憾,尽管知道原因,也尝试过几乎所有可行的办法,但就是没法解决。很无奈,编程工作就是如此,半年前的代码,核心程序不变,搁现在重构一下,就跑不通了。

心情灰暗了一整个上午,下面是报错详细内容。

最近在将半年前写的Python股票分析程序重构,打算写一个标准的Python包出来。write_records_into_mysql是所有程序写入MySQL的接口,它有两个必输参数,分别是df和table_name;三个默认参数,分别是conn、if_exists、dtype。

其它细节不贴,一眼就能看明白,这个函数主要作用是调用pandas.DataFrame.to_sql接口,将df写入数据库。to_sql接收的参数和write_records_into_mysql接收的参数其实是一样的,乍一看这里好像存在重复封装,为什么不直接调用to_sql写数据库,而要采用调用write_records_into_mysql的方式?这是一个好问题。

阅读全文 »

Redis初体验

发表于 2018-03-27 | 分类于 编程 | 阅读次数:
字数统计: 789 | 阅读时长 ≈ 4

前两天整理使用Python爬虫下载电子书一文时,提过要给爬虫程序增加缓存处理。后面花了2天时间把Redis用法摸熟,然后在Mac上配置好了Redis环境。搭好环境后,发现那个爬虫程序其实非常简单,使出Redis有点大材小用,于是把Redis用在缓存股票数据上面,结果效果非常好。

关于Redis的缓存处理,我参考了陈皓老师缓存更新的套路文中提到的“Cache Aside Pattern”模式,来进行缓存设计,下面直接引用他博客里面的内容,非常受启发。

  • 失效:应用程序先从cache取数据,没有得到,则从数据库中取数据,成功后,放到缓存中。
  • 命中:应用程序从cache中取数据,取到后返回。
  • 更新:先把数据存到数据库中,成功后,再让缓存失效。

Fetch data from Redis

Update data in db

阅读全文 »

清除GitHub提交历史记录

发表于 2018-03-23 | 分类于 编程 | 阅读次数:
字数统计: 636 | 阅读时长 ≈ 3

clean air

(Photo by Alex Vasey on Unsplash)

昨天提交代码到GitHub仓库时,不小心把敏感信息(登陆账号和登陆密码)提交了上去。发现后立马在GitHub上修改源代码,将里面的敏感信息删除,删除后查看这个文件的历史操作记录,包含敏感信息的历史版本仍然存在。

以为删除文件可以解决这个问题,然而并非如此,把整个文件删除后,历史记录并没有被清空,反而增多一条删除文件的操作,前面两步操作的记录仍然存在。

网上搜了一大圈解决办法,最终找到的解决办法如下。

阅读全文 »

使用Python爬虫下载电子书

发表于 2018-03-21 | 分类于 编程 | 阅读次数:
字数统计: 2,329 | 阅读时长 ≈ 11

spider(Photo by Aaron Burden on Unsplash)

这两天将半年前写的爬虫代码重构了一下,本来以为要不了多久,结果前前后后花了我将近4个小时的时间。

无力吐槽!:sob:

半年前的代码是一个面向过程的处理,几个函数顺序执行,最终慢悠悠地把PDF生成出来,功能都齐全,但是可读性和拓展性极差。现在全部改为面向对象处理,将requests.Session操作剥离出来作为Crawler类,将解析网页的操作剥离出来作为Parse类,结构清楚了很多,耦合度(较之前)大大降低,基本达到我的要求。

整体功能实现后,我写了一个cache函数,将Session操作缓存起来方便后续复用,本地调试成功,但最终没有采用。我的设想是在一定期限内将Session操作常驻内存,每次执行前检查缓存中有没有,有的话就直接用,没有才新建。但我这个cache函数在程序执行完后,缓存的内容直接被释放,每次执行都需要新建Session连接。这几天在学习Redis,估计我想要的效果得用redis才能实现。

在将网页生成HTML文件到本地后,使用pdfkit工具将HTML文件转换为PDF很耗费时间,这一点请大家注意。

环境准备

macOS 10.11.6 + Anaconda Navigator 1.7.0+ Python 2.7.12 + Sublime 3.0

技术要点

  • Requests会话处理
  • BeautifulSoup网页解析
  • pdfkit工具(注意,一定要先安装wkhtmltopdf这个工具包)
  • decorator装饰器
阅读全文 »
1…101112…16
大西洋暖流

大西洋暖流

76 日志
7 分类
152 标签
常用链接
  • 廖雪峰
  • 阮一峰
  • 王垠
  • 酷壳
  • Python之禅
  • Python入坑指南
  • Echo李金
  • Flask资源
  • Python面试题
  • HelloGitHub
© 2016 — 2025 大西洋暖流 | Site words total count: 97.1k

粤公网安备 44030602003362号