1. 程式人生 > >sqlautocode使用過程的一些坑

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自己去研究研究。