【问题标题】:Create a MySQL insert query using a nested dictionary and custom parameters使用嵌套字典和自定义参数创建 MySQL 插入查询
【发布时间】:2021-05-19 04:49:29
【问题描述】:

我在 Python 中有一个嵌套字典“sample_dict 和一些 Parameters

import pandas as pd

#Parameters
Condition_Name='ID_0.5_365D'
Insert_Date='2021-05-19 00:00:00'

sample_dict=\
{pd.Timestamp('2015-01-02 00:00:00'): {'navi.o_efx': 180.0,
  'navi.o_qrvo.o': 180.0,
  'navi.o_stm.n': 180.0,
  'qrvo.o_efx': 1.0,
  'qrvo.o_stm.n': 1.0},
 pd.Timestamp('2014-12-31 00:00:00'): {'navi.o_efx': 179.0,
  'navi.o_stm.n': 179.0}}

对于给定的日期,具有不同的键和值。

用于插入的MySQL表“sample_table”的结构如下:

CREATE TABLE sample_table (
  Date datetime DEFAULT NULL,
  Pair_Name varchar(255) DEFAULT NULL,
  Condition_Name varchar(255) DEFAULT NULL,
  Condition_Value double(16, 4) DEFAULT NULL,
  Insert_Date datetime DEFAULT NULL
)
ENGINE = INNODB,
AVG_ROW_LENGTH = 159,
CHARACTER SET latin1,
COLLATE latin1_swedish_ci;

如何通过合并“sample_dict”和“Parameters”在 Python 中使用 for 循环创建 MySQL 插入查询?例如,输出查询应按如下所示格式创建:

INSERT INTO sample_table(Date, Pair_Name, Condition_Name,Condition_Value,Insert_Date) VALUES ('2015-01-02 00:00:00','navi.o_efx','ID_0.5_365D',180,'2021-05-19 00:00:00');
INSERT INTO sample_table(Date, Pair_Name, Condition_Name,Condition_Value,Insert_Date) VALUES ('2015-01-02 00:00:00', 'navi.o_qrvo.o','ID_0.5_365D',180,'2021-05-19 00:00:00');
INSERT INTO sample_table(Date, Pair_Name, Condition_Name,Condition_Value,Insert_Date) VALUES ('2015-01-02 00:00:00',  'navi.o_stm.n','ID_0.5_365D',180,'2021-05-19 00:00:00');
INSERT INTO sample_table(Date, Pair_Name, Condition_Name,Condition_Value,Insert_Date) VALUES ('2015-01-02 00:00:00',  'qrvo.o_efx','ID_0.5_365D',1,'2021-05-19 00:00:00');
INSERT INTO sample_table(Date, Pair_Name, Condition_Name,Condition_Value,Insert_Date) VALUES ('2015-01-02 00:00:00',  'qrvo.o_stm.n','ID_0.5_365D',1,'2021-05-19 00:00:00');
INSERT INTO sample_table(Date, Pair_Name, Condition_Name,Condition_Value,Insert_Date) VALUES ('2014-12-31 00:00:00','navi.o_efx','ID_0.5_365D',179,'2021-05-19 00:00:00');
INSERT INTO sample_table(Date, Pair_Name, Condition_Name,Condition_Value,Insert_Date) VALUES ('2014-12-31 00:00:00','navi.o_stm.n','ID_0.5_365D',179,'2021-05-19 00:00:00');

sample_table”中的最终插入将如下所示:

【问题讨论】:

  • “sample_table”中的最终插入内容如下: 1) 作为文本发布,而不是作为图片发布(格式正确); 2)显示与显示的源数据严格匹配的输出(不是“像这样”)。
  • @Akina:我已经发布了插入内容及其确切的相应输出。在批评之前,请花点时间去思考它! :)
  • 糟糕...抱歉。我对 12 小时值(以及 MySQL 的非标准日期时间格式)感到困惑

标签: python mysql python-3.x dictionary


【解决方案1】:

如果你想要简单的字符串构造,应该这样做:

prefix = 'INSERT INTO sample_table(Date, Pair_Name, Condition_Name, Condition_Value, Insert_Date) VALUES ('
for timestamp, samples in sample_dict.items():
    for pair_name, condition_value in samples.items():
        print(f"{prefix}'{timestamp}', '{pair_name}', '{Condition_Name}', {condition_value}, '{Insert_Date}');")

输出:

INSERT INTO sample_table(Date, Pair_Name, Condition_Name, Condition_Value, Insert_Date) VALUES ('2015-01-02 00:00:00', 'navi.o_efx', 'ID_0.5_365D', 180.0, '2021-05-19 00:00:00');
INSERT INTO sample_table(Date, Pair_Name, Condition_Name, Condition_Value, Insert_Date) VALUES ('2015-01-02 00:00:00', 'navi.o_qrvo.o', 'ID_0.5_365D', 180.0, '2021-05-19 00:00:00');
INSERT INTO sample_table(Date, Pair_Name, Condition_Name, Condition_Value, Insert_Date) VALUES ('2015-01-02 00:00:00', 'navi.o_stm.n', 'ID_0.5_365D', 180.0, '2021-05-19 00:00:00');
INSERT INTO sample_table(Date, Pair_Name, Condition_Name, Condition_Value, Insert_Date) VALUES ('2015-01-02 00:00:00', 'qrvo.o_efx', 'ID_0.5_365D', 1.0, '2021-05-19 00:00:00');
INSERT INTO sample_table(Date, Pair_Name, Condition_Name, Condition_Value, Insert_Date) VALUES ('2015-01-02 00:00:00', 'qrvo.o_stm.n', 'ID_0.5_365D', 1.0, '2021-05-19 00:00:00');
INSERT INTO sample_table(Date, Pair_Name, Condition_Name, Condition_Value, Insert_Date) VALUES ('2014-12-31 00:00:00', 'navi.o_efx', 'ID_0.5_365D', 179.0, '2021-05-19 00:00:00');
INSERT INTO sample_table(Date, Pair_Name, Condition_Name, Condition_Value, Insert_Date) VALUES ('2014-12-31 00:00:00', 'navi.o_stm.n', 'ID_0.5_365D', 179.0, '2021-05-19 00:00:00');

【讨论】:

    【解决方案2】:

    你甚至可以直接插入mysql:

    import pandas as pd
    
    import mysql.connector
    
    from sqlalchemy import create_engine
    
    result_dict, result_list = {}, []
    
    #collect input
    
    Condition_Name='ID_0.5_365D'
    
    Insert_Date='2021-05-19 00:00:00'
    
    sample_dict=\
    {pd.Timestamp('2015-01-02 00:00:00'): {'navi.o_efx': 180.0,
      'navi.o_qrvo.o': 180.0,
      'navi.o_stm.n': 180.0,
      'qrvo.o_efx': 1.0,
      'qrvo.o_stm.n': 1.0},
     pd.Timestamp('2014-12-31 00:00:00'): {'navi.o_efx': 179.0,
      'navi.o_stm.n': 179.0}}
    
    #populate result_dict
    for key,value in sample_dict.items():
        for item_key, item_value in value.items():
            result_dict['condition_name']=Condition_Name
            result_dict['insert_date']=Insert_Date
            result_dict['date']=key
            result_dict['pair_name']=item_key
            result_dict['pair_value']=item_value
            result_list.append(result_dict.copy())
    
    index_list = range(1, len(result_list)+1)
    
    df1 = pd.DataFrame(result_list, columns = ['index', 'condition_name', 'insert_date', 'date', 'pair_name', 'pair_value'], index= index_list)
    
    #dump into mysql
    engine = create_engine('mysql+mysqldb://[user]:[pass]@[host]:[port]/[schema]', echo = False)
    df1.to_sql(name = 'my_table', con = engine, if_exists = 'append', index = False)
    

    【讨论】:

    • 感谢您的解决方案。 result_dict 中的值在每次循环后都会被覆盖。你能纠正一下解决方案吗
    • @PrateekDaniels 是的,我的错。改变完成了欢呼!
    • 感谢您做出更改,但还是有问题。列表“result_list”产生重复的日期条目:'2014-12-31 00:00:00'
    • result_list 应该有七个唯一的条目
    • 我发现了错误,更正的代码行应该是:result_list.append(result_dict.copy())
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-27
    • 1970-01-01
    • 2020-06-28
    • 2019-09-17
    相关资源
    最近更新 更多