2009-10-22 61 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”执行的规则。