zoukankan      html  css  js  c++  java
  • 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自己去研究研究。

  • 相关阅读:
    app爬虫(python)开发——通过docker部署多任务端app应用数据抓取系统(终结篇)
    app爬虫(python)开发——app软件数据抓取进阶之实战笔记
    app爬虫(python)开发——简单app数据抓取入门实战案例笔记
    app爬虫(python)开发——移动端自动化控制工具(appium,inspector等)笔记
    JavaCV FFmpeg采集摄像头YUV数据
    java安全编码指南之:lock和同步的正确使用
    《.net之美》之读书笔记(二) C#中的泛型
    跟我一起学.NetCore之WebApi接口裸奔有风险(Jwt)
    一个爬虫的故事:这是人干的事儿?
    从零开始针对 .NET 应用的 DevOps 运营实践
  • 原文地址:https://www.cnblogs.com/thomson-fred/p/9764950.html
Copyright © 2011-2022 走看看