【最后203篇系列】034 使用SQLite構建簡單的任務管理

表數據同步的斷點續傳

有時候需要將一個表的數據復制到另一個表,循環是常用的方式。當表比較大,執行的時間很長,會有很多因素引起失敗。我希望可以比較簡單的跑數,所以做一個簡單的任務系統。

SQLitre是嵌入式數據庫,這樣腳本可以不必考慮太多依賴,又可以用到數據庫的持久化功能。

1 數據庫初始化

給到一個文件路徑參數,確定持久化的文件

import sqlite3
import time
import randomdef init_db(DB_FILE = "tasks.db"):"""初始化數據庫和表"""conn = sqlite3.connect(DB_FILE)conn.row_factory = sqlite3.Row cur = conn.cursor()cur.execute("""CREATE TABLE IF NOT EXISTS tasks (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT NOT NULL,content TEXT, status INT DEFAULT 0  -- 0=未開始, 1=進行中, 2=完成, 3=失敗)""")# 可選:給 status 建索引cur.execute("CREATE INDEX IF NOT EXISTS idx_status ON tasks(status)")cur.execute("CREATE INDEX IF NOT EXISTS idx_name ON tasks(name)")conn.commit()return conn, cur

實際中可以以腳本的file path作為參數(結尾改為.db)

# 建立數據庫
conn, cur = init_db(DB_FILE = './the_script.db')

2 任務初始化

同步任務,可以按照id分為若干區間,每個區間任務額可以稱為lot。

tuple_list = slice_list_by_batch1(min_id,max_id, 10000)
task_df = pd.DataFrame()
task_df['name'] = ['lot_%s' % i for i in range(len(tuple_list)) ]  
task_df['content'] = tuple_list
task_df['content'] = task_df['content'].apply(lambda x: json.dumps(x))
task_lod = df2lod(task_df)
# 寫入任務
cur.executemany("INSERT INTO tasks (name, content) VALUES (?,?)", [(t['name'],t['content']) for t in task_lod])
conn.commit()res = cur.execute('select count(*) from tasks').fetchone()
dict(res)

sqlite也可以提供類似 Row Dict的格式,需要

    conn.row_factory = sqlite3.Row cur = conn.cursor()row = cur.execute(new_task_sql).fetchone()

3 處理一次

每次啟動時,讀出未處理的任務。任務里有tuple參數,根據tuple的起止區間獲取數據后進行處理,如果成功就根據任務名將狀態更新為2,異常則更新為3。這樣每次重復執行這個就可以了,因為數據持久化在文件中,所以即使和服務器斷開連接也沒關系。

def process_one():new_task_sql  = 'select name, content, status from tasks where status = 0 limit 1'# new_task = cur.execute(new_task_sql).fetchall()conn.row_factory = sqlite3.Row cur = conn.cursor()row = cur.execute(new_task_sql).fetchone()process_code = 1if row:row_dict = dict(row)tem_tuple = json.loads(row_dict['content'])print('>>>> ',row_dict['name'])try:some_tuple = tem_tuple---- DO LOGICcur.execute("UPDATE tasks SET status = 2 WHERE name = ?", (row_dict['name'],))conn.commit()except:cur.execute("UPDATE tasks SET status = 3 WHERE name = ?", (row_dict['name'],))conn.commit()else:process_code = 0return process_code

4 處理直到結束

由于 process_one在沒有獲取到待處理任務行時會返回0,這個作為結束信號。所以可以給到一個略大的循環次數,當收到結束信號時停止。

for i in range(30000):process_code = process_one()if not process_code:print('無待處理任務')break 

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/94522.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/94522.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/94522.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SpringCloud Alibaba核心知識點

Spring Cloud Alibaba 是阿里巴巴開源的一套微服務解決方案,與 Spring Cloud 生態深度集成。以下是其主要組件及其功能:Nacos服務注冊與發現:支持動態服務注冊、健康監測及DNS-Based服務發現。配置中心:提供分布式配置管理&#x…

LeetCode 分類刷題:34. 在排序數組中查找元素的第一個和最后一個位置

題目給你一個按照非遞減順序排列的整數數組 nums,和一個目標值 target。請你找出給定目標值在數組中的開始位置和結束位置。如果數組中不存在目標值 target,返回 [-1, -1]。你必須設計并實現時間復雜度為 O(log n) 的算法解決此問題。示例 1:…

自建知識庫,向量數據庫 (十二)之 文章向量搜索——仙盟創夢IDE

“未來之窗” 文章向量搜索:多領域應用與學習指南 在數字化浪潮中,“未來之窗” 文章向量搜索憑借其獨特的技術優勢,在酒店、電商、診療及知識庫等多個領域展現出巨大的應用潛力,為各行業的信息處理與檢索帶來了全新的視角和高效…

深度剖析:基于反射的.NET二進制序列化器設計與實現

🔍 深度剖析:基于反射的.NET二進制序列化器設計與實現本文將從底層原理到高級優化,全面剖析一個基于反射的.NET二進制序列化器的設計與實現,涵蓋類型系統處理、內存布局、遞歸算法、性能優化等核心主題。1. 設計哲學與架構總覽 1.…

如何在 Ubuntu 上安裝和配置 Samba ?

Samba 是一個開源程序,用于文件共享和網絡打印,使用 SMB 協議。現在基本上用于提供在 Windows 上可訪問的 Linux 文件共享系統。 本文介紹如何在 Ubuntu 上安裝和配置 Samba 服務器,以便跨文件夾共享網絡上不同的計算機。 Update Your Syst…

MATLAB實現CNN-GRU-Attention時序和空間特征結合-融合注意力機制混合神經網絡模型的風速預測

該 MATLAB 代碼實現了一個基于 CNN-GRU-Attention 時序和空間特征結合-融合注意力機制混合神經網絡模型的風速預測。以下是對代碼的簡要分析:一、主要功能 該代碼用于風速時間序列預測,使用歷史風速特征數據(18個特征,75天&#x…

【升級版】從零到一訓練一個 0.6B 的 MoE 大語言模型

前文:從零到一訓練一個 0.6B 的 MoE 大語言模型,本次升級完全重新從零開始重新訓練。主要升級如下: 替換預訓練數據集,使用序列猴子通用文本數據集進行預訓練。使用更先進的訓練方法。新增思考模式控制,可通過添加/th…

51單片機-實現定時器模塊教程

本章概述思維導圖: 51單片機驅動定時器模塊 CPU時序簡介 CPU時序定義了CPU內部操作的時間節奏,以下從四個時序周期進行逐步解析; 1、振蕩周期 振蕩周期:CPU內部時鐘源產生的最小時間單位,由晶振或內部振蕩器決定&am…

7.Kotlin的日期類

以下是 Kotlin 中常用時間類(基于 java.time 包)的核心方法及使用示例,參考數組方法的表格形式,按類分類展示: 一、LocalDate(日期:年/月/日)方法簽名返回值說明示例now(): LocalDat…

【Big Data】Hive技術解析:大數據倉庫的SQL橋梁

Hive作為Apache頂級項目,是Hadoop生態系統中最具影響力的SQL查詢引擎,它解決了大數據處理與傳統SQL技能之間的鴻溝。Hive的核心價值在于將類SQL查詢語言HiveQL無縫轉換為分布式計算框架MapReduce的任務,使數據分析師能夠利用熟悉的SQL語法操作…

Ubuntu2204server系統安裝postgresql14并配置密碼遠程連接

前言: 最近因項目需要安裝postgresql14,系統是ubuntu2204server系統,安裝好后發現無法實現遠程連接,解決了之后在此記錄一下解決方法。 疑問: 什么情況下需要配置postgresql遠程連接? ①如果是postgresql和…

【嵌入式】【搜集】狀態機、狀態遷移圖及狀態模式材料

文章目錄狀態機狀態機狀態機定義與核心特點狀態機總結狀態遷移圖狀態遷移圖狀態遷移圖核心概念與要素狀態遷移圖常見錯誤與規避狀態遷移圖總結狀態模式狀態模式狀態模式核心概念與組成狀態模式核心價值與適用場景狀態模式優缺點分析進階優化技巧行為模式總結狀態機 狀態機 狀…

Java學習歷程14——制作一款五子棋游戲(4)

上次我們基本實現了五子棋游戲的功能,這次我們進行一些優化和添加一些便于用戶使用的功能。新增功能及優化一、復盤功能復盤功能就是指在下完一局棋后,我們可以通過復盤按鈕使本局棋的所有棋子重頭開始自動下一遍。分析得知,我們首先要保存以…

記錄一次el-table+sortablejs的拖拽bug

bug回顧出現bug的情況時 當編輯表格過于緊湊的時候 有些非必要編輯或需要一眼看到的數據 移動到了el-table-column typeexpand時 同事:怎么拖拽功能用不了了 ok開始檢查代碼 當原來是個簡單的編輯表格 不涉及展開和簡單拖拽時 不會出現問題 解決了 出現了展開行以后…

利用go sort.Sort()排序自定義切片

1 sort.Sort()簡介2 核心功能3 調用前提4 代碼示例 1 sort.Sort()簡介 Go語言中的sort.Sort函數是標準庫提供的通用排序接口 2 核心功能 核心功能支持多種類型進行快速排序 基礎類型支持?:內置Ints、Float64s、Strings等函數直接排序常見切片 自定義排序?&a…

Elasticsearch腦裂緊急處理與預防

在 Elasticsearch 中出現 網絡分區(Network Partition) 或 腦裂(Split-Brain) 導致兩個子集群各自選出 Master 的情況,是非常嚴重的問題。比如這個場景(20個節點分裂成兩個10節點的子集群,各自選…

華為網路設備學習-29(BGP協議 四)路由策略-實驗

示例 延伸-具體實驗1.代碼部分:基礎配置R1 [Huawei]int GigabitEthernet 0/0/0 [Huawei-GigabitEthernet0/0/0]ip address 10.1.13.1 24[Huawei]int LoopBack 1 [Huawei-LoopBack1]ip address 172.16.1.1 24 [Huawei-LoopBack1]q [Huawei]int LoopBack 2 [Huawei-Lo…

500系列狀態碼與可能的場景

501 Not Implemented(未實現)HTTP 方法不支持客戶端發送了 PUT、DELETE、PATCH 請求但服務器只實現了 GET 和 POST協議功能不支持客戶端使用了 HTTP/2 的某些高級特性服務器只支持 HTTP/1.1,無法處理,返回 501API 接口未完成開發中…

大數據、hadoop、爬蟲、spark項目開發設計之基于數據挖掘的交通流量分析研究

大數據、hadoop、爬蟲、spark項目開發設計之基于數據挖掘的交通流量分析研究

Pytest項目_day20(log日志)

Log日志優點:記錄程序運行信息,方便定位問題python日志模塊logging,日志等級如下: DEBUGINFO(正常)WARNINGERROR(報錯)示例代碼如下:import logging import os.path impo…