Sqlautocode使用过程的一些坑
Sqlautocode是SQLAlchemy一个数据库映射工具,可以将数据库文件映射为python代码,直接在程序中移植使用。最近在使用过程中遇到了一些坑,通过用代码编辑工具pycharm阅读源码和多方查找技术论坛如SegmentFault和StackOverflow,通过系列的代码追踪和分析,最终解决了一些关于Sqlautocode在实用上的版本冲突问题。现在说说我在使用中遇到的坑,作为分享,希望对读者有用。
我使用的是Linux操作系统,其他操作系统可能不会出现以下的一些问题。
为了更好地说明坑是怎么来的。首先讲讲Sqlautocode的简单用法:
pip install sqlautocode
安装好了sqlautocode包后在终端输入:
sqlautocode mysql://'root':'XXX'@127.0.0.1:3306/dbname -t Goods -o goods-test.py
就可以将所想要导出的数据表导出为py文件
这条命令中的数据库地址 ‘ mysql://'root':'XXX'@127.0.0.1:3306/dbname ’ 与我们平常在程序中写的数据库地址没有什么区别。dbname就是我们要导出的数据库,Goods就是数据库里面的一张表(这是我之前创建好的一张表),goods-test.py就是我导出的py文件名(不需要事先创建,命令执行过程会自动创建)。注意:-t -o 一定要有,这是命令的参数,分别表示的含义是table(数据表),output(输出)
在Linux系统终端输入上面的命令后,在调试的过程,出现了以下三个问题
错误1:
except sqlalchemy.exceptions.SQLAlchemyError, ex:
AttributeError: 'module' object has no attribute 'exceptions'
解决思路:
阅读错误信息可以看到,'module' object has no attribute 'exceptions'
什么意思?翻译过来就是模块对象没有一个叫‘exceptions’的属性,也就是说,sqlalchemy没有这个exceptions类!
那究竟如何解决这个问题?在pycharm(再一次点赞pycharm,在阅读源码方面真的很方便)中点击开sqlalchemy的源码,用ctrl+F可以定位查找我们需要查找的内容,输入'exc'会发现得到了定位,原来新版sqlalchemy用的是exc模块下的SQLAchemyError
用pycharm寻找源码的出处,对exceptions进行更改,改为sqlachemy.exc.SQLAlchemyError
错误2:
no mysqldb
我通过查找StackOverflow上的文章解决的,解决方案可以参考地址:
https://stackoverflow.com/questions/2952187/getting-error-loading-mysqldb-module-no-module-named-mysqldb-have-tried-pre
注意:通常出现错误原因是sqlalchemy0.7(最新版本)和python2.7(旧版本)间的冲突,体现在一些代码的书写上的不同(实际是引用类的不同)
错误3:
在运行命令
sqlautocode mysql://'root':'XXX'@127.0.0.1:3306/dbname -t Goods -o goods-test.py
时总是报出以下错误:
解决思路:
在StackOverflow上搜寻无果,决定自己根据错误信息一步步地进行分析
首先用pycharm打开sqlautocode的_ _init_ _.py文件,
找到reflection_schema = db.dialect.default_schema_name 这句代码,
再用ctrl+鼠标左键,发现是无法进行跳转到相应源码的函数位置,所以推测是sqlachemy版本升级之后与python2.7源码不匹配,需要对sqlchemy源码进行一些修改。
接下来是ctrl+鼠标左键,点击dialect跳转到源码位置,发现以下
显然,db.dialect在获取默认表名的时候是用dialect.default_schema_name属性来获取的,而不是用函数get_default_schema_name()
同时sqlalchemy源码中tablenames = db.dialect.table_names(conn, reflection_schema)一行实际上调用的是
tablenames = db.dialect.get_table_names(conn, reflection_schema)
即table_names()应该换为get_taable_names()方法。
进行以上修改之后再在终端输入命令
sqlautocode mysql://'root':'XXX'@127.0.0.1:3306/dbname -t Goods -o goods-test.py
就可以获取到表格的ORM映射.py文件
好了,上面3个问题轻松解决了,关于为什么是这样解决的,这就要涉及到源码版本问题和源码的一些行文逻辑问题了,要深究下来会有很多东西要讲,我自己目前对sqlautocode这款工具的源码还没完全理解透彻,就不在这里班门弄斧了。有兴趣的读者可以用pycharm自己去研究研究。
Sqlautocode使用过程的一些坑的更多相关文章
- 表结构中updated_time设计为ON UPDATE CURRENT_TIMESTAMP时,使用过程的一个坑
一.mysql表结构中存在如下设计时 表结构中updated_time设计为ON UPDATE CURRENT_TIMESTAMP时,如下 `updated_time` datetime NOT NU ...
- flutter 安装过程遇到的坑
Flutter是一个移动应用程序的软件开发工具包(SDK),用一个代码库构建高性能.高保真的iOS和Android应用程序.目标是使开发人员能够为Android和iOS提供自然的高质量的应用,在滚动行 ...
- Torch-RNN运行过程中的坑 [2](Lua的string sub函数,读取中文失败,乱码?)
0.踩坑背景 仍然是torch-rnn/LanguageModel.lua文件中的一些问题,仍然是这个狗血的LM:encode_string函数: function LM:encode_string( ...
- Torch-RNN运行过程中的坑 [1](读取Lua非空table,size为0)
0.踩坑背景 执行Torch-RNN的时候,在LanguageModel.lua中的encode_string函数中,对start_text的各个character进行id映射编码,实现功能类似“北京 ...
- Torch-RNN运行过程中的坑 [0](一些基础概念)
0.Lua & LuaJIT简介 Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能. Lua 是巴 ...
- 菜鸟帮你跳过openstack配置过程中的坑
一:前言 对于一个以前做java全栈工程师而言,而且没学过Linux,很少用虚拟机(还是在大学的时候简单的用过),去配置openstack我想我入的坑肯定比有基础的一定要多,躺在每个坑中徘徊思索的时间 ...
- 菜鸟帮你跳过openstack配置过程中的坑[文末新添加福利]
一:前言 对于一个以前做java全栈工程师而言,而且没学过Linux,很少用虚拟机(还是在大学的时候简单的用过),去配置openstack我想我入的坑肯定比有基础的一定要多,躺在每个坑中徘徊思索的时间 ...
- Vue发布过程中遇到坑,以及webpack打包优化
前言 这段时间,本人自己做了一个vue画面部署到自己的服务器上,发现运行速度慢的的惊人,虽然服务器很渣(本人没什么钱,只能租最差的服务器,主要是给自己学习用的),但是这样开发出来的网站简直不能用,所以 ...
- 学习django3过程中的坑
最近跟着Django by Example 2015学习,可老想用最新版的Django3.在学的过程中可踩了不少坑. 今天就又碰到一个: 在这本书中96页有这样的代码: url(r'^login/$' ...
随机推荐
- 【sping揭秘】17、@Around,@Introduction
package cn.cutter.start.bean; import org.apache.commons.logging.Log; import org.apache.commons.loggi ...
- hdu 6161--Big binary tree(思维--压缩空间)
题目链接 Problem Description You are given a complete binary tree with n nodes. The root node is numbere ...
- DevExpress GridView自动滚动
引言 最新有一个winform项目使用的是DevExpress的控件,所以最近都在摸索使用这套控件,实在是佩服整套控件的强大,同时代码写起来也简洁.客户有一个需求,希望报表结果能在外接的大屏幕上定时滚 ...
- Django--模板层template
一 模版简介 你可能已经注意到我们在例子视图中返回文本的方式有点特别. 也就是说,HTML被直接硬编码在 Python代码之中. def current_datetime(request): now ...
- mysql 开发进阶篇系列 36 工具篇mysqlshow(数据库对象查看工具)
一.概述 mysqlshow客户端查找工具,能很快地查找存在哪些数据库,数据库中的表,表中的列或索引,和mysql客户端工具很类似,不过有些特性是mysql客户端工具所不具备的. mysqlshow的 ...
- JAR(Spring Boot)应用的后台运行配置
酱油一篇,整理一下关于Spring Boot后台运行的一些配置方式.在介绍后台运行配置之前,我们先回顾一下Spring Boot应用的几种运行方式: 运行Spring Boot的应用主类 使用Mave ...
- Python之列表推导式
我们经常需要这样处理一个列表:把一个列表里面的每个元素, 经过相同的处理 ,生成另一个列表. 比如:一个列表1,里面都是数字,我们需要生成一个新的列表B,依次存放列表A中每个元素的平方 怎么办? 当然 ...
- Filebeat的Registry文件解读
你可能没有注意但很重要的filebeat小知识 Registry文件 Filebeat会将自己处理日志文件的进度信息写入到registry文件中,以保证filebeat在重启之后能够接着处理未处理过的 ...
- 通过反射实现IOC功能
这段时间园子里有不少介绍IOC组件的文章,由于自己也一直在学习IOC的各种组件,及IOC的思想,常见的IOC组件很多:AutoFac.Ninject.Utity包括.NET自带的MEF等.由于今天周六 ...
- java远程调试(idea)
遇见一个怪异问题,无奈线上数据库有限制,只能远程调试下代码.突然发现,远程调试代码真的好简单,简单记录下操作步骤. 1.在idea里创建一个Remote,远程连接的入口. 找到 Edit Config ...