【问题标题】:Using multiple databases with ElixirElixir 使用多个数据库
【发布时间】:2009-10-22 10:32:18
【问题描述】:

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

我唯一想到的就是:

from sys import argv

metadata.bind = argv[1]

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

【问题讨论】:

    标签: python python-elixir


    【解决方案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 的部分有点 hack。我使用它是因为 OptionParser 不返回正常的哈希值,而这正是我在最后一行中使用的绑定字符串所需要的。

    【讨论】:

    • 创建一个字符串是没有意义的——sqlalchemy 会将它分离回它的组件。最好创建URLsqlalchemy.org/docs/05/reference/sqlalchemy/…o=options ; URL(o.engine, username=o.user, password=o.password, host=o.host, database=o.database)的实例
    • 没想到有这样的技术存在 :) 将来我一定会使用它。
    【解决方案2】:

    您的问题似乎与 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”即可执行规则。

    【讨论】:

      猜你喜欢
      • 2017-09-24
      • 1970-01-01
      • 2016-02-13
      • 2011-08-13
      • 2010-10-12
      • 2011-12-29
      • 1970-01-01
      • 1970-01-01
      • 2011-02-08
      相关资源
      最近更新 更多