sqlautocode是SQLAlchemy一个数据库映射工具,可以将数据库文件映射为python代码,
直接在程序中移植使用。最近在使用过程中遇到了一些坑,自己通过阅读源码分析解决了
问题。现在说说我在使用中遇到的坑,作为分享。
我使用的是Linux操作系统,其他操作系统可能不会出现以下的一些问题。
错误1:
except sqlalchemy.exceptions.SQLAlchemyError, ex:
AttributeError: 'module' object has no attribute 'exceptions'
解决:
新版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
时总是报出以下错误:
在Stack Overflow上搜寻无果,决定自己一步步地进行分析
首先用pycharm打开对应的_ _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自己去研究研究。