我想为使用 elixir for ORM 的程序提供数据库。现在数据库文件(我正在使用 SQLite)必须在元数据中硬编码,但我希望能够在 argv 中传递它。有什么办法可以做得很好吗?
我唯一想到的是:
from sys import argv
metadata.bind = argv[1]
我可以在主脚本中设置它并且它将用于定义任何实体的所有模块吗?
我想为使用 elixir for ORM 的程序提供数据库。现在数据库文件(我正在使用 SQLite)必须在元数据中硬编码,但我希望能够在 argv 中传递它。有什么办法可以做得很好吗?
我唯一想到的是:
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)s@%(host)s/%(database)s' % options
请注意,使用 opt_hash 的部分有点小技巧。我使用它是因为 OptionParser 不返回正常的哈希值,这是我在最后一行中使用的绑定字符串真正需要的。
您的问题似乎与 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”即可执行规则。