MySQL Connector / Пайтон не реализует Commit

У меня есть следующая функция, которая должна брать данные с JSON и сохранять это в базе данных MySQL

def saveMetric(metrics):
    cnx     = RDS_Connect()
    cursor  = cnx.cursor()
    jsonMetrics = json.loads(metrics)
    #print type(jsonMetrics['Metrics'])
    # Every 2000 registries, the script will start overrriding values
    persistance = 2000
    save_metrics_query = (
            "REPLACE INTO metrics "
            "SET metric_seq = (SELECT COALESCE(MAX(row_id), 0) %% %(persistance)d + 1 FROM metrics AS m), "
            "instance_id = \'%(instance_id)s\', "
            "service = \'%(service)s\' , "
            "metric_name = \'%(metric_name)s\', "
            "metric_value = %(metric_value)f"
           )
    for metric in jsonMetrics['Metrics']:
        formatData = {}
        formatData['persistance'] = persistance
        formatData['instance_id'] = arguments.dimensionValue
        formatData['service'] = jsonMetrics['Service']
        formatData['metric_name'] = metric
        formatData['metric_value'] = jsonMetrics['Metrics'][metric]

        print save_metrics_query % formatData

        try:
            cursor.execute(save_metrics_query, formatData, multi=True)
            logger('info','Metrics were saved successfully!')
            cnx.commit()
        except mysql.connector.Error as err:
            logger('error', "Something went wrong: %s" % err)
    cursor.close()
    cnx.close()

RDS_Connect() реализуй связь в инстанцию RDS, эта функция уже я протестировал ее и функционируй правильно. Вопрос состоит, в том, что выполнив эту функцию, данные не появляются в DB. Я попытался выполняя query в руку 3 раза и функционируй. Здесь виден результат этого 3 выполнения.

Я думаю, что могла бы быть проблема с commit() но он бы это не находил.

Если он служит помощью, JSON, который питает функцию, - такой:

{
  "Metrics": {
      "CPUUtilization": 1.33, 
      "NetworkIn": 46428.0, 
      "NetworkOut": 38772.0
  }, 
  "Id": "i-03932937bd67622c4", 
  "Service": "AWS/EC2"
}

Если кто-то видит то, за чем оно последует, он был бы благодарен за помощь.

3
задан 14.04.2016, 15:29
2 ответа

DirГ, - который ты перемещаешь плохо аргументы query. paramstyles из DB-API python не используют кавычки , не равняются аргументам цепей формата. В частности, fomato pyformat всегда %(name)s, без кавычек и с s string .

Пытается asГ - видеть:

save_metrics_query = (
        "REPLACE INTO metrics "
        "SET metric_seq = (SELECT COALESCE(MAX(row_id), 0) %% %(persistance)s + 1 FROM metrics AS m), "
        "instance_id = %(instance_id)s, "
        "service = %(service)s , "
        "metric_name = %(metric_name)s, "
        "metric_value = %(metric_value)s"
       )
2
ответ дан 24.11.2019, 14:35
  • 1
    Хотя это не была причина проблемы, это очень хороший tip. Я буду иметь это в виду. Спасибо! – Agustin 14.04.2016, 20:54
  • 2
    Я не понимаю хорошо. Ты счел хорошим soluci и # 243; n @C и # 233; sar не повторно использования курсора, но в комментариях ты даешь понять, что проблема была, которую помести, и # 237; схвати плохо формат пары и # 225; метры. – ChemaCortes 15.04.2016, 02:48
  • 3
    Верно. Я confund и # 237; с другим comment другого thread. Сейчас я стараюсь исправлять это. – Agustin 15.04.2016, 02:57

Это могла бы быть тема повторного применения курсоров, у меня были когда-нибудь проблемы с этим, ты должен бы быть используя курсор из-за сделки вместо того, чтобы использовать тот же курсор для всех сделок.

Сказав это, стоило бы, чтобы ты попробовал обновить твой код для того, чтобы это осталось более или менее так:

def saveMetric(metrics):
    cnx = RDS_Connect()    
    # Lo que resta de tu código
    for metric in jsonMetrics['Metrics']: 
        cursor  = cnx.cursor()
        # Tus operaciones
        cursor.close()
    cnx.close()
1
ответ дан 24.11.2019, 14:35
  • 1
    Именно я верю в это, что я вызываю проблему. Но я не отпускаю никакого exception. Тема была с этой линией. и lt; < < < < " metric_value = % (metric_value) f" > > > > > эта f. Я это сменил на одну s и я функционирую. Спасибо! – Agustin 14.04.2016, 20:55