我想爲我的程序提供使用elixir進行ORM的數據庫。現在數據庫文件(我正在使用SQLite)必須在元數據中進行硬編碼,但我希望能夠在argv中傳遞此文件。有什麼辦法可以做到這一點很好嗎?在Elixir中使用多個數據庫
我想的唯一一件事就是:
from sys import argv
metadata.bind = argv[1]
我可以設置這個主腳本,它會在所有模塊中使用,定義的任何實體?
我想爲我的程序提供使用elixir進行ORM的數據庫。現在數據庫文件(我正在使用SQLite)必須在元數據中進行硬編碼,但我希望能夠在argv中傳遞此文件。有什麼辦法可以做到這一點很好嗎?在Elixir中使用多個數據庫
我想的唯一一件事就是:
from sys import argv
metadata.bind = argv[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不會返回一個正常的散列,這是我在最後一行使用的綁定字符串的好處所需要的。
你的問題似乎更多地與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」執行的規則。
創建一個字符串沒有任何意義 - 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
還沒有意識到這種技術存在:)我一定會在未來。 – workmad3 2009-10-22 12:29:37