【问题标题】:How to update newly added rows in mysql database excluding already updated rows using python pandas如何使用python pandas更新mysql数据库中新添加的行,不包括已经更新的行
【发布时间】:2018-07-02 00:36:10
【问题描述】:

我有下面的代码可以批量更新 mysql 数据库。

count = pd.read_sql_query("SELECT count(*) FROM table",con=db)
count = count.iat[0,0]
batchsize = 1000
for offset in range(0,count,batchsize):
    df = pd.read_sql(('SELECT id,col2,col3 FROM table LIMIT %s OFFSET %s' 
                      % (batchsize,offset)), con=db)
    ## code ##
    cursor = db.cursor()
    cursor.executemany("UPDATE table SET col2=%s, col3=%s WHERE id=%s",d)
    db.commit()
db.close()   

更新后,如果新记录被添加到 mysql 数据库中,则必须通过运行相同的脚本来更新这些记录。该代码作为 python 脚本在 linux 环境中运行。

【问题讨论】:

  • 您的问题不清楚,您是否希望在添加新行后立即发生一些事情? IE。一个触发器。为什么一添加就需要更新,添加过程肯定也要调整记录。
  • 没有@AndyG,不是在添加新行后立即。但是在添加了一些新记录之后,如果我们运行脚本,则应该只更新那些新记录。

标签: python mysql linux pandas


【解决方案1】:

我创建了一个pickle file 来保存表的行数。每次运行脚本时,我都会从 pickle 文件中读取行数(在上次执行时更新)并从那里开始执行。我更新后的代码如下所示:

count = pd.read_sql_query("SELECT count(*) FROM table",con=db)
count = count.iat[0,0]
start = None
with open("pickle_file_name.pkl", 'rb') as f:
    start = pickle.load(f)
batchsize = 1000
for offset in range(start,count,batchsize):
    df = pd.read_sql(('SELECT id,col2,col3 FROM table LIMIT %s OFFSET %s' 
                      % (batchsize,offset)), con=db)
    ## code ##
    cursor = db.cursor()
    cursor.executemany("UPDATE table SET col2=%s, col3=%s WHERE id=%s",d)
    db.commit()
with open("pickle_file_name.pkl", 'wb') as f:
    pickle.dump(count, f)
db.close() 

通过这种方式,我始终可以将行数保存在 pickle 文件中,并从该计数开始通过执行相同的脚本来更新新添加的行。

【讨论】:

    猜你喜欢
    • 2020-10-13
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多