sqlautocode使用過程的一些坑
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自己去研究研究。