1

多数の変数を受け取り、それらからSQLクエリを作成するPython関数があります。

def myfunc(name=None, abbr=None, grade=None, ...)

これらの値はSQLクエリを作成する必要があります。そのためには、等しい人Noneはに変更する必要がありNULL、有用な値を格納する人は'sで囲む必要があります。

name="'"+name+"\'" if name else 'NULL'
abbr="'"+abbr+"\'" if abbr else 'NULL'
...
Lots of lines here - that's my problem!
...

そしてより、

query="""INSERT INTO table(name, abbr, ...)
         VALUES (%(name)s, %(abbr)s, ...) """ locals()
cur.execute(query)

このルールに従って変数の内容を変更するためのより良い、よりPythonicな方法はありますか?

アダム

4

3 に答える 3

5

SQLクエリを作成する最良の方法は、文字列形式ではありません。オブジェクトのexecuteメソッドは、プレースホルダーとシーケンス(または、DB APIの正確な実装によってはdict)を含むクエリ文字列を取得します。そこで代用します。次に、必要なNone-to-Nullおよび文字列引用符を実行します。cursor

その可能性を検討することを強くお勧めします。ただし、他の目的で文字列処理が必要な場合は、次のようにすることができます。

processed = dict((n, "'%s'" % v if v is not None else 'NULL')
                 for n, v in locals().iteritems())

さらに文字列をフォーマットするprocessed代わりに辞書を使用します。locals()

于 2010-01-31T17:54:44.507 に答える
0

myfunc次のように定義できます。

def myfunc(*args, **kwargs)

kwargs は、関数に渡されるすべての名前付きパラメーターを保持する辞書です。

クエリ パラメータの値を取得するには、 を使用しますkwargs.get(name_of_parameter, 'NULL')。クエリを作成するには、すべてのディクショナリ アイテムを反復するだけです。ただし、名前付きパラメーターとして関数に渡されたパラメーターは、この方法で実行するとクエリに含まれることに注意してください。

于 2010-01-31T17:57:30.910 に答える