使用Elixir的多个数据库

时间:2009-10-22 10:32:19

标签: python python-elixir

我想为使用elix for ORM的程序提供数据库。现在,数据库文件(我正在使用SQLite)必须在元数据中进行硬编码,但我希望能够在argv中传递它。有什么办法可以做到这一点吗?

我唯一想到的是:

from sys import argv

metadata.bind = argv[1]

我可以在主脚本中设置它,它将用于定义任何实体的所有模块吗?

2 个答案:

答案 0 :(得分: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)s@%(host)s/%(database)s' % options

请注意,使用opt_hash的部分有点像黑客。我使用它是因为OptionParser没有返回正常的哈希值,这是我在最后一行使用的绑定字符串的优点所需要的。

答案 1 :(得分:0)

你的问题似乎与python中的一般参数解析比与elixir更相关。

无论如何,我遇到了类似的问题,我通过使用不同的配置文件并使用python中的configparse模块解析它们来解决它。

例如,我有两个配置文件,每个配置文件都描述了一个数据库的数据库URL,用户名,密码等。当我想切换到另一个配置时,我将一个像--configfile guest这样的选项传递给脚本(我使用argparse作为命令行界面),然后脚本查找名为guest.txt的配置文件,并且读取那里的所有信息。

这样更安全,因为如果将元数据字符串作为命令行参数传递,则可能会出现一些安全问题,而且输入时间会长很多。

顺便说一下,你也可以发现写一个Makefile来存储最常用的选项很有用。

e.g。 cat> 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

并且在命令行中,您只需键入“make debug_db”或“make connect_db1”来执行规则。