1

ElixirforORMを使用するプログラムのデータベースを提供したいと思います。現在、データベースファイル(私は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

あなたの質問は、elixirよりもPythonでの一般的な引数の解析に関連しているようです。

とにかく、私は同様の問題を抱えていました、そして私は異なる構成ファイルを使用し、それらをpythonのconfigparseモジュールで解析することによってそれを解決しました。

たとえば、2つの構成ファイルがあり、それぞれが1つのデータベースの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

コマンドラインで「makedebug_db」または「makeconnect_db1」と入力するだけで、ルールを実行できます。

于 2009-10-22T10:44:38.117 に答える