2009-10-22 4 views
1

Je voudrais fournir une base de données pour mon programme qui utilise elixir pour ORM. À l'heure actuelle, le fichier de base de données (j'utilise SQLite) doit être codé en dur dans les métadonnées, mais j'aimerais pouvoir le transmettre dans argv. Y a-t-il un moyen de le faire bien?Utilisation de plusieurs bases de données avec Elixir

La seule chose que je pensais est à:

from sys import argv 

metadata.bind = argv[1] 

Puis-je configurer dans le script principal et il serait utilisé dans tous les modules, qui définissent les entités?

Répondre

1

J'ai un code qui fait cela d'une manière un peu plus sympa que d'utiliser simplement 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 

Notez que la pièce à l'aide opt_hash est un peu un hack. Je l'utilise car OptionParser ne renvoie pas un hachage normal, ce qui est vraiment nécessaire pour la gentillesse de la chaîne de liens que j'utilise dans la dernière ligne.

+2

Cela n'a pas de sens de créer une chaîne - sqlalchemy va le séparer dans ses composants. Mieux vaut créer une instance de 'URL' http://www.sqlalchemy.org/docs/05/reference/sqlalchemy/connections.html#sqlalchemy.engine.url.URL ' o = options; URL (o.engine, nom d'utilisateur = o.user, mot de passe = o.password, host = o.host, base de données = o.database) ' – nosklo

+0

n'avait pas réalisé qu'une telle technique existait :) Je vais certainement l'utiliser dans le avenir. – workmad3

0

Votre question semble être plus liée à l'analyse des arguments généraux en python qu'à l'élixir.

Quoi qu'il en soit, j'ai eu un problème similaire, et je l'ai résolu en utilisant différents fichiers de configuration et en les analysant avec le module configparse en python. Par exemple, j'ai deux fichiers de configuration, et chacun d'entre eux décrit l'URL db, le nom d'utilisateur, le mot de passe, etc. d'une base de données. Lorsque je veux passer à une autre configuration, je passe une option comme --configfile guest au script (j'utilise argparse pour l'interface de ligne de commande), puis le script recherche un fichier de configuration appelé guest.txt, et lit toutes les informations Là.

Ceci est beaucoup plus sûr, car si vous passez une chaîne de métadonnées comme argument de ligne de commande, vous pouvez rencontrer des problèmes de sécurité, et de plus, il est beaucoup plus long à taper. Par ailleurs, vous pouvez également trouver utile d'écrire un Makefile pour stocker les options les plus courantes.

par exemple. 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 

et sur la ligne de commande, il suffit de taper « faire debug_db » ou « faire connect_db1 » pour exécuter une règle.

Questions connexes