Ошибка вставки mysqldb при вставке Ошибка 1241: операнд должен содержать 1 столбец

dbPickle = pickle.dumps(self.rawRequestObject)

это мой рассол, который мне нужно хранить в базе данных MySQL вместе с некоторыми другими данными.

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. Может кто-нибудь подсказать мне, что именно мне не хватает?

Я прошел ТАК вопросы о той же ошибке, но ни один из них не подходит для моего случая.

Нашел проблему и решение: после небольшой отладки я понял, что единственный способ сохранить их в столбцах TEXT MySql - это сначала выполнить str (), а затем также использовать conn.escape_string (), потому что это 'and "в значениях, которые вставляются, что на самом деле вызывает проблему. Так что теперь я могу вставить значения.

Однако это приводит к другой проблеме. Теперь, когда я читаю эти значения из базы данных, мне не нужны экранированные значения. Я хочу, чтобы 'и' были там, как они были до того, как их убежать. Похоже, что нет никаких функций, чтобы обратить это вспять, и мой единственный выход - это ручная обработка. Есть ли лучший способ сделать это?

0 ответов

Другие вопросы по тегам