2009-10-22 8 views
1

ORM 용 엘릭서를 사용하는 프로그램 용 데이터베이스를 제공하고 싶습니다. 지금은 데이터베이스 파일 (SQLite를 사용하고 있습니다)을 메타 데이터에 하드 코딩해야하지만 argv에서이 파일을 전달할 수 있기를 원합니다. 이 일을 할 수있는 방법이 있습니까? 어떤 엔티티를 정의하는,Elixir에서 여러 데이터베이스 사용

from sys import argv 

metadata.bind = argv[1] 

내가 주 스크립트에서이 설정 가능하고 모든 모듈에 사용되는 :

내가 생각있는 유일한 방법은 있나요?

답변

1

난 그냥 opt_hash를 사용하여 부품이 해킹의 비트인지 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 

주를 사용하는 것보다 약간 더 좋은 방식으로이 작업을 수행하는 코드가 있습니다. 나는 OptionParser가 정상적인 해시를 반환하지 않기 때문에 이것을 사용하는데, 이것은 최종 행에서 사용하는 바인드 문자열의 niceness에 실제로 필요한 것이다.

+2

문자열을 만드는 것이 의미가 없습니다. - 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

+0

은 그러한 기술이 존재하지 않았다는 것을 깨달았습니다. 미래. – workmad3

0

귀하의 질문은 일반적인 인자 분석과 관련이있는 것으로 보입니다.

어쨌든 비슷한 문제가있어서 다른 구성 파일을 사용하고 파이썬에서 configparse 모듈로 구문 분석하여 해결했습니다.

예를 들어 두 개의 구성 파일이 있으며 각 파일에는 하나의 데이터베이스에 대한 db URL, 사용자 이름, 암호 등이 있습니다. 다른 구성으로 전환하려면 --configfile guest와 같은 옵션을 스크립트에 전달합니다 (명령 줄 인터페이스에 argparse을 사용). 그런 다음 스크립트는 guest.txt라는 구성 파일을 찾아 모든 정보를 읽습니다 그곳에.

메타 데이터 문자열을 명령 줄 인수로 전달하면 보안 문제가 발생할 수 있으며 입력하는 데 시간이 오래 걸리기 때문에 훨씬 안전합니다.

그런데 가장 일반적인 옵션을 저장하기 위해 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 

명령 줄에 메이크

만 규칙을 실행하기 위해 'connect_db1을'입력 'debug_db을'또는해야합니다.

관련 문제