sql >> データベース >  >> RDS >> PostgreSQL

PythonでSQLステートメントを生成する

    これは古い質問ですが、OPが望んでいると思われるもの、つまり基本的なSQLを生成するための非常にシンプルなライブラリが必要なことがよくあります。

    以下の関数はまさにそれを行います。使用するデータを含むテーブル名と辞書を指定すると、必要な操作のSQLクエリが返されます。

    キーと値のペアは、データベース行のフィールド名と値を表します。

    def read(table, **kwargs):
        """ Generates SQL for a SELECT statement matching the kwargs passed. """
        sql = list()
        sql.append("SELECT * FROM %s " % table)
        if kwargs:
            sql.append("WHERE " + " AND ".join("%s = '%s'" % (k, v) for k, v in kwargs.iteritems()))
        sql.append(";")
        return "".join(sql)
    
    
    def upsert(table, **kwargs):
        """ update/insert rows into objects table (update if the row already exists)
            given the key-value pairs in kwargs """
        keys = ["%s" % k for k in kwargs]
        values = ["'%s'" % v for v in kwargs.values()]
        sql = list()
        sql.append("INSERT INTO %s (" % table)
        sql.append(", ".join(keys))
        sql.append(") VALUES (")
        sql.append(", ".join(values))
        sql.append(") ON DUPLICATE KEY UPDATE ")
        sql.append(", ".join("%s = '%s'" % (k, v) for k, v in kwargs.iteritems()))
        sql.append(";")
        return "".join(sql)
    
    
    def delete(table, **kwargs):
        """ deletes rows from table where **kwargs match """
        sql = list()
        sql.append("DELETE FROM %s " % table)
        sql.append("WHERE " + " AND ".join("%s = '%s'" % (k, v) for k, v in kwargs.iteritems()))
        sql.append(";")
        return "".join(sql)
    

    あなたはそれをそのように使います。テーブル名と辞書を付けるだけです(またはPythonの** kwargs機能を使用してください):

    >>> upsert("tbl", LogID=500, LoggedValue=5)
    "INSERT INTO tbl (LogID, LoggedValue) VALUES ('500', '5') ON DUPLICATE KEY UPDATE LogID = '500', LoggedValue = '5';"
    
    >>> read("tbl", **{"username": "morten"})
    "SELECT * FROM tbl WHERE username = 'morten';"
    
    >>> read("tbl", **{"user_type": 1, "user_group": "admin"})
    "SELECT * FROM tbl WHERE user_type = '1' AND user_group = 'admin';"
    

    ただし、SQLインジェクション攻撃に注意

    コードの悪意のあるユーザーがこれを行うとどうなるか見てみましょう:

    >>> read("tbl", **{"user_group": "admin'; DROP TABLE tbl; --"})
    "SELECT * FROM tbl WHERE user_group = 'admin'; DROP TABLE tbl; --';"
    

    独自の仮のORMを作成するのは簡単ですが、表示されたものしか取得できません。入力を自分でエスケープする必要があります:)



    1. PostgreSQLのバックグラウンドプロセスに関するドキュメントは誰にありますか?

    2. MVC3アプリケーションでフォーム認証を使用してOracleデータベースを使用する

    3. クエリ中にタイムスタンプを読み取り可能な日付に変換する

    4. @@SERVERNAMEを使用してSQLServerのローカルサーバー名を返します