2014-02-09 31 views
2

我正在開發一個webapp的前端,我的合作開發人員正在使用Pyramid和SQAlchemy。我們剛剛從SQLite移到MySQL。我在OS X機器上安裝了MySQL 5.6.15(通過Homebrew),以使Python MySQLdb安裝正常工作(通過virtualenv中的pip)。如何通過SQLalchemy將secure_auth傳遞給MySQL登錄

因爲在MySQL> = 5.6.5中secure_auth現在是ON默認情況下,我只能連接到遠程數據庫(pre 5.6.5)與--skip-secure-auth標誌,它在終端工作正常。但是,在Python Pyramid代碼中,似乎只可能將此標誌添加爲an argument to create_engine(),但在我的共同開發者代碼中找不到create_engine(),只有初始化配置文件中的連接字符串如下所示。他是不可用的,這不是我的專業領域,我們推出下週:(

sqlalchemy.url = mysql+mysqldb://gooddeeds:[email protected]/gooddeeds_development?charset=utf8 

我已經試過各種附加到"secure auth" strings以上,但沒有成功。我是不是找錯了地方?有MySQLdb設置爲secure_authON,因爲我運行MySQL 5.6.15?如果是這樣,我該如何改變它?

+1

你是否有MySQL服務器的確切錯誤信息?我不確定secure_auth與它有多大關係。如果您仍然在使用不安全的舊密碼(來自4.1之前),那麼您現在已經改變了這一點。 – geertjanvdk

+0

這是衆所周知的「使用舊的(4.1.1版之前的)認證協議拒絕的連接...」,但是,我們無法對服務器上的MySQL進行更改。我*可以*使用--skip-secure-auth標誌登錄命令行,我承認這只是一個臨時解決方案。現在,我需要通過SQLAlchemy完成相同的操作。 –

回答

2

如果您在使用MySQL 5.6時強制使用舊密碼(bah!),並且使用MySQLdb SQLAlchemy,您必須將--skip-secure-auth添加到選項文件並使用URL:

from sqlalchemy.engine.url import URL 

.. 

dialect_options = { 
    'read_default_file': '/path/to/your/mysql.cnf', 
} 

engine = create_engine(URL(
    'mysql', 
    username='..', password='..', 
    host='..', database='..', 
    query=dialect_options 
)) 

的mysql.cnf將包含:

[client] 
skip-secure-auth 

對於金字塔,你可以做到以下幾點。在配置ini文件保存連接參數添加一行:

sqlalchemy.url = mysql://scott:[email protected]/test 
sqlalchemy.connect_args = { 'read_default_file': '/path/to/foo' } 

現在,您需要更改位的設置被讀取和使用方式。在啓動您的Pyramic的應用程序文件,請執行下列操作:

def main(global_config, **settings): 
    try: 
     settings['sqlalchemy.connect_args'] = eval(settings['sqlalchemy.connect_args']) 
    except KeyError: 
     settings['sqlalchemy.connect_args'] = {} 
    engine = engine_from_config(settings, 'sqlalchemy.') 
    # rest of code.. 

關鍵是要評價其包含了SQLAlchemy的方言額外的選項字典ini文件中的字符串。

+1

這是如何工作在金字塔,我們正在使用'engine = engine_from_config(設置,'sqlalchemy。')'? - (合作開發者) –

+2

我已經用金字塔解決方案更新了我的答案。 – geertjanvdk

相關問題