我想为使用elix for ORM的程序提供数据库。现在,数据库文件(我正在使用SQLite)必须在元数据中进行硬编码,但我希望能够在argv中传递它。有什么办法可以做到这一点吗?
我唯一想到的是:
from sys import argv
metadata.bind = argv[1]
我可以在主脚本中设置它,它将用于定义任何实体的所有模块吗?
答案 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”来执行规则。