0

dbPickle = pickle.dumps(self.rawRequestObject)

他のデータと一緒にmysql dbに保存する必要がある私のピクルスです。

def addNewResultsToDb(self, reqTimeStamp = None, reqNumber = None, reqPort = None, reqScheme = None, reqMethod = None, reqPath = None, reqHeaders = None, reqQueryParams = None, reqBody = None, putThisPickleInDb = None):
    insertValueQry = "INSERT INTO request_logs(request_as_on, request_number, request_port, request_scheme, request_method, request_path, request_headers, request_query_params, request_body, session_pickle) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"


    # picking out values to be inserted (the different parts of the request), in the db, from the arguments to the method
    print "\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n"
    print reqTimeStamp
    print reqNumber
    print reqPort
    print reqScheme
    print reqMethod
    print reqPath
    print reqHeaders
    print reqQueryParams
    print reqBody

    print type(reqTimeStamp)
    print type(reqNumber)
    print type(reqPort)
    print type(reqScheme)
    print type(reqMethod)
    print type(reqPath)
    print type(reqHeaders)
    print type(reqQueryParams)
    print type(reqBody)
    print "\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n"

    try:

        debugMessage = "DataAccessObject --> addNewResultsToDb() --> try {} inserting data in table"
        debug(debugMessage)

        self.cur.execute(insertValueQry,(reqTimeStamp, reqNumber, reqPort, reqScheme, reqMethod, reqPath, reqHeaders, reqQueryParams, reqBody, putThisPickleInDb))
        self.con.commit()

    except mdb.Error, e:
        if self.con:
            self.con.rollback()
        print "Error %d: %s" % (e.args[0],e.args[1])
        exit(1)

    finally:
        if self.con:
            self.con.close()
# ----------------------------------------------------------------------------------------------------------------------------------------

上記は、データをデータベースに挿入する私の方法です。

以下は、それぞれ上記のメソッドに渡される値です。

16-09-2015 16:18:01
1
80
http
POST
['3', 'resource', 'android', 'appConfigs']
[['sn', '2.VI7D9DF640615B4948854C88C5E769B94C.SIE5FB3A28D0DA4F27A3D2C03B8FAAFFAE.VS144113550487914225873.1442395729'], ['Browser-Name', 'Mobile Safari'], ['Accept-Encoding', 'gzip'], ['secureToken', '5nANXZrlYBrl0UByhA+qlpLsjHXlnF97tQLHnPgcjwZm9u0t8XZHtO4XTjKODcIb0ee4LlFchmUiptWZEPDUng=='], ['User-Agent', 'Mozilla/5.0 (Linux; U; Android 4.3; en-us; Google Galaxy Nexus - 4.3 - API 18 - 720x1280 Build/JLS36G) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 FKUA/Retail/590206/Android/Mobile (Genymotion/Google Galaxy Nexus - 4.3 - API 18 - 720x1280/fd6babaa1ff9127ed7e9cc7a916639e5)'], ['Device-Id', 'fd6babaa1ff9127ed7e9cc7a916639e5'], ['Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8'], ['Host', 'mobileapi.flipkart.net'], ['Connection', 'Keep-Alive'], ['Content-Length', '749']]
[]
{"params":{"appVersion":"3.4.0.5","language":"EN","screenSize":"xhdpi"},"versions":{"blockedSharingApps":"blockedSharingApps.3","appUpgradeData":"appUpgradeData.16","blockedAppVersions":"blockedAppVersions.1","adsDataConfig":"adsDataConfig.36","sellerFilters":"sellerFilters.2","webViewABDataMap":"webViewABDataMap.6","serviceProfileData":"serviceProfileData.2","visualConfig":"visualConfig.45","rules":"rules.3.4.0.5.1","menuItem":"menuItem.3.4.0.5.3","batchNetworkingData":"batchNetworkingData.3","reviewFilters":"reviewFilters.1","jsResources":"jsResources.101","appRateData":"appRateData.6","appTheme":"appTheme.7","imageconfig":"imageconfig.xhdpi.21","actionToUrl":"actionToUrl.10","appendPincode":"appendPincode.2","messages":"messages.EN.2"}}
dbPickle

type() によって報告される上記のそれぞれのデータ型は次のとおりです。

<type 'str'> 
<type 'int'>
<type 'int'>
<type 'str'>
<type 'str'>
<type 'list'>
<class 'netlib.odict.ODictCaseless'>
<class 'netlib.odict.ODict'>
<type 'str'> 
and the last one being a pickle itself dbPickle

以下は、上記の値を挿入しようとしているテーブル スキーマです。

CREATE TABLE IF NOT EXISTS request_logs(request_as_on DATETIME, request_number TEXT, request_port TEXT, request_scheme TEXT, request_method TEXT, request_path TEXT, request_headers TEXT, request_query_params TEXT, request_body TEXT, session_pickle BLOB)

データの挿入中に発生するエラーは次のとおりです。

エラー 1241: オペランドには 1 列を含める必要があります

私はpython MySqlDbを使用しています。誰かが正確に何が欠けているか教えてもらえますか?

私は同じエラーに関してSOの質問をしましたが、私のケースには当てはまらないようです。

問題と解決策が見つかりました: 数分のデバッグの後、MySql の TEXT 列にこれらを格納する唯一の方法は、最初にそれらを str() し、次に conn.escape_string() を使用することであることに気付きました。 "実際に問題を引き起こしている値が挿入されています。これで、値を挿入できるようになりました。

ただし、これは別の問題を引き起こします。これらの値をデータベースから読み返すと、エスケープされた値は必要ありません。' と " をエスケープする前のようにそこに置きたいと思います。これを元に戻す機能がないように見えます。私の唯一の方法は、手動で処理することです。これを行うより良い方法はありますか?

4

0 に答える 0