1

すべてのデフォルト引数を受け取り、次の方法でそれらの引数から SQL クエリを生成する Python モジュールに次のメソッドがあります。

上記のSQLクエリを生成するためのより良い(そしてエレガントでPythonicな)方法があるかどうか疑問に思っています

def myquery(arg1=None, arg2=None, arg3=None):
    query = "SELECT column FROM table WHERE"
    params = []
    if arg1 is not None:
        query = query + " arg1 = " + arg1
        params.append(arg1)

    if arg2 is not None:
        if params is not None:
            query = query + "AND arg2 = " + arg2
        else:
            query = query + " arg 2 = " + arg2
        params.append(arg2)

    if arg3 is not None:
        if params is not None:
            query = query + "AND arg3 = " + arg3
        else:
            query = query + " arg 3 = " + arg3
        params.append(arg3)
    return query
4

2 に答える 2

3

ORMなしでこれを行う場合は、次のようにします

def QueryWhere(table,where={}):
    params = ["%s=?"%key for key in where.keys()] #take advantage of builtin query placeholders (?)
    c = db.cursor()
    c.execute("SELECT * FROM %s WHERE %s"%(table," AND ".join(params)),where.values())
    return c.fetchall()

print QueryWhere("users",{"name":"johndoe","pass":"1c4$g"}) 

とにかくそのようなもの... ORMの使用を検討することもお勧めします

于 2012-12-22T01:41:04.927 に答える
0

コードにはいくつかの小さな問題があります (AND の前のスペース、単一の arg2/arg3 引数で関数が呼び出された場合の間違った結果など)。したがって、関数が動作するはずだと信じているので、これに答えています-お気軽に修正してください。

これを行う最もpythonicな方法は、関数の引数の代わりに辞書を使用することだと思います-必要に応じて、引数辞書を使用して、現在と同じ関数の動作を公開できます。さらに、反復、リスト内包表記、および文字列の書式設定を使用することで得られることがたくさんあります。

def myquery2(**args):
    query = "SELECT column FROM table WHERE"
    options= [" {0} = {1}".format(arg, value) for arg,value in args.iteritems()]
    return query + " AND".join( options )
于 2012-12-22T01:42:58.283 に答える