1

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

我唯一想到的是:

from sys import argv

metadata.bind = argv[1]

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

4

2 回答 2

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 不返回正常的哈希值,这是我在最后一行中使用的绑定字符串真正需要的。

于 2009-10-22T10:45:30.033 回答
0

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

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

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

这更安全,因为如果您将元数据字符串作为命令行参数传递,您可能会遇到一些安全问题,而且输入时间要长得多。

顺便说一句,您还可以发现编写一个 Makefile 来存储最常用的选项很有用。

例如 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”即可执行规则。

于 2009-10-22T10:44:38.117 回答