2009-10-22 35 views
1

我想爲我的程序提供使用elixir進行ORM的數據庫。現在數據庫文件(我正在使用SQLite)必須在元數據中進行硬編碼,但我希望能夠在argv中傳遞此文件。有什麼辦法可以做到這一點很好嗎?在Elixir中使用多個數據庫

我想的唯一一件事就是:

from sys import argv 

metadata.bind = argv[1] 

我可以設置這個主腳本,它會在所有模塊中使用,定義的任何實體?

回答

1

我有一些代碼,這是否在一個稍微更好的方式比只使用的argv

from optparse import OptionParser 

parser = OptionParser() 
parser.add_option("-u", "--user", dest="user", 
        help="Database username") 
parser.add_option("-p", "--password", dest="password", 
        help="Database password") 
parser.add_option("-D", "--database", dest="database", default="myDatabase", 
        help="Database name") 
parser.add_option("-e", "--engine", dest="engine", default="mysql", 
        help="Database engine") 
parser.add_option("-H", "--host", dest="host", default="localhost", 
        help="Database host") 

(options, args) = parser.parse_args() 

def opt_hash(name): 
    global options 
    return getattr(options, name) 

options.__getitem__ = opt_hash 

metadata.bind = '%(engine)s://%(user)s:%(password)[email protected]%(host)s/%(database)s' % options 

注意,使用opt_hash部分是一個黑客攻擊的一位。我使用它,因爲OptionParser不會返回一個正常的散列,這是我在最後一行使用的綁定字符串的好處所需要的。

+2

創建一個字符串沒有任何意義 - sqlalchemy會將它分離回其組件。更好地創建一個「URL」實例http://www.sqlalchemy.org/docs/05/reference/sqlalchemy/connections.html#sqlalchemy.engine.url.URL 'o = options; URL(o.engine,username = o.user,password = o.password,host = o.host,database = o.database)' – nosklo 2009-10-22 11:47:56

+0

還沒有意識到這種技術存在:)我一定會在未來。 – workmad3 2009-10-22 12:29:37

0

你的問題似乎更多地與python中的一般參數解析相比,與elixir。

無論如何,我有一個類似的問題,我已經通過使用不同的配置文件並解析它們與Python中的configparse模塊來解決它。

例如,我有兩個配置文件,每個配置文件都描述了一個數據庫的數據庫URL,用戶名,密碼等。當我想切換到另一個配置時,我將諸如--configfile guest這樣的選項傳遞給腳本(我使用argparse作爲命令行界面),然後腳本查找名爲guest.txt的配置文件,並讀取所有信息那裏。

這樣會更安全一些,因爲如果您將元數據字符串作爲命令行參數傳遞,則可能會出現一些安全問題,而且鍵入的時間也更長。

順便說一句,你還可以找到有用的寫一個Makefile來存儲最常用的選項。

例如貓>的Makefile

debug_db: 
    ipython connect_db.py -config guest -i 

connect_root: 
    ipython connect_db.py -config db1_root -i 

connect_db1: 
    ipython connect_db.py -config db1 -i 

,並在命令行中,你只需要輸入「讓debug_db」或「使connect_db1」執行的規則。