2010-01-29 5 views
1

Je suis donc tout nouveau dans SQLAlchemy et j'essaie d'utiliser l'API SQL Expression pour créer une instruction SELECT qui spécifie les colonnes exactes revenir. J'ai trouvé à la fois un class et un function défini dans le module sqlalchmey.sql.expressions et je ne suis pas sûr de savoir lequel utiliser ... Pourquoi ont-ils à la fois une classe et une fonction? Quand utiliseriez-vous l'un par rapport à l'autre? Et serait-on prêt à expliquer pourquoi ils ont besoin d'avoir les deux dans leur bibliothèque? Cela n'a pas vraiment de sens pour moi d'être honnête, autre que de me confondre. :) JKSQLAlchemy sqlalchemy.sql.expression.select vs sqlalchemy.sql.expression.Select

Merci pour l'aide à l'avance!

Répondre

3

Use the source.

est ici la mise en œuvre de la fonction select, à partir du code source:

def select(columns=None, whereclause=None, from_obj=[], **kwargs): 
    """Returns a ``SELECT`` clause element. 
    (... long docstring ...) 
    """ 
    return Select(columns, whereclause=whereclause, from_obj=from_obj, **kwargs) 

Ainsi, il est exactement la même chose.

+0

Ahhh ... alors est-ce juste une question de commodité/préférence? Je ne vois pas vraiment l'intérêt d'avoir les deux, car vous importeriez les deux en utilisant le même chemin (sauf pour le changement de cas pour la lettre ', bien sûr). – John

0

Je pense que c'est à peu près la même chose. La documentation indique pour select (la fonction):

The returned object is an instance of Select. 

Comme vous pouvez passer la fonction de sélection les mêmes paramètres que Select.__init__() accepte, je ne vois pas vraiment de différence. À première vue, les arguments du constructeur de classe semblent être un sur-ensemble de la fonction. Mais la fonction peut être transmise à l'un des arguments du constructeur.

+0

C'est ce que j'essaie de comprendre ... à quoi bon avoir les deux? Des idées pour lesquelles ils ont fait ça? – John

1

Le package d'expression fournit des fonctions Python pour tout faire. Dans certains cas, ces fonctions renvoient une instance de classe verbatim à partir des arguments de la fonction et d'autres fois composent un objet à partir de plusieurs composants. C'était à l'origine l'idée que les fonctions feraient beaucoup plus de composition que ce qu'elles ont fini par faire à la fin. Dans tous les cas, le paquet préfère coller à pep-8 jusqu'à ce que les classes soient dans CamelCase, les fonctions étant toutes minuscules, et veut que l'API frontale soit en minuscules - donc vous avez les fonctions publiques "constructor".

Le langage d'expression SQL est très facile à grok si vous commencez par the tutorial.