我想为我的程序提供使用elixir进行ORM的数据库。现在数据库文件(我正在使用SQLite)必须在元数据中进行硬编码,但我希望能够在argv中传递此文件。有什么办法可以做到这一点很好吗?在Elixir中使用多个数据库
我想的唯一一件事就是:
from sys import argv
metadata.bind = argv[1]
我可以设置这个主脚本,它会在所有模块中使用,定义的任何实体?
我想为我的程序提供使用elixir进行ORM的数据库。现在数据库文件(我正在使用SQLite)必须在元数据中进行硬编码,但我希望能够在argv中传递此文件。有什么办法可以做到这一点很好吗?在Elixir中使用多个数据库
我想的唯一一件事就是:
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)[email protected]%(host)s/%(database)s' % options
注意,使用opt_hash部分是一个黑客攻击的一位。我使用它,因为OptionParser不会返回一个正常的散列,这是我在最后一行使用的绑定字符串的好处所需要的。
你的问题似乎更多地与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”执行的规则。
创建一个字符串没有任何意义 - 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
还没有意识到这种技术存在:)我一定会在未来。 – workmad3 2009-10-22 12:29:37