1

この質問に非常によく似ていますPythonでのMySQL Dynamic Query Statement

ただし、2つのリストの代わりに私がやろうとしているのは、辞書を使用することです

私がこの辞書を持っているとしましょう

instance_insert = {
#    sql column      variable value
    'instance_id'   : 'instnace.id',
    'customer_id'   : 'customer.id',
    'os'            : 'instance.platform',
}

また、sql 列を sql 列名として使用し、変数名を mysql テーブルに挿入される値を保持する変数として使用する挿入ステートメントを mysql データベースに入力したいと考えています。

このステートメントが何をするのか正確に理解していないので、ちょっと迷ったのですが、私が投稿した質問から引き出されました。

sql = "INSERT INTO instance_info_test VALUES (%s);" % ', '.join('?' for _ in instance_insert)
cur.execute (sql, instance_insert)

また、辞書に列を追加/削除できるという意味で動的にしたいと思います

4

1 に答える 1

0

投稿する前に、質問により具体的なものを検索してみてください。たとえば、「python mysqldb insert dictionary」を Google で検索すると、最初のページのhttp://mail.python.org/pipermail/tutor/2010-December/080701.htmlに適切な回答が見つかりました。関連部分:

上記の一般化されたバージョンを作成しようとしたときに思いついたのは次のとおりです。

def add_row(cursor, tablename, rowdict):
    # XXX tablename not sanitized
    # XXX test for allowed keys is case-sensitive

    # filter out keys that are not column names
    cursor.execute("describe %s" % tablename)
    allowed_keys = set(row[0] for row in cursor.fetchall())
    keys = allowed_keys.intersection(rowdict)

    if len(rowdict) > len(keys):
        unknown_keys = set(rowdict) - allowed_keys
        print >> sys.stderr, "skipping keys:", ", ".join(unknown_keys)

    columns = ", ".join(keys)
    values_template = ", ".join(["%s"] * len(keys))

    sql = "insert into %s (%s) values (%s)" % (
        tablename, columns, values_template)
    values = tuple(rowdict[key] for key in keys)
    cursor.execute(sql, values)

filename = ...
tablename = ...
db = MySQLdb.connect(...)
cursor = db.cursor()
with open(filename) as instream:
    row = json.load(instream)
add_row(cursor, tablename, row)

ピーター

入力が常に有効であることがわかっており (テーブル名が有効で、列がテーブルに存在する)、例のように JSON ファイルからインポートしていない場合は、この関数を単純化できます。しかし、それはあなたが達成したいことを達成します。最初は DictCursor が役立つように見えるかもしれませんが、DictCursor は値の辞書を返すのに便利なように見えますが、dict から実行することはできません。

于 2013-04-27T17:40:22.263 に答える