在pymysql的SSCursor踩的生成器的坑

在Python3連接mysql要用到pymysql模塊异旧。
一般用的是普通游標,執(zhí)行select等語句fetchall時是直接存入內存,有內存不夠的風險。這時可以用SSCursor长豁,貌似中文叫做流式游標?連接時需要這樣:

    conn = pymysql.connect(dbhost, dbuser, dbpass, dbname, charset='utf8')
    cur = conn.cursor(pymysql.cursors.SSCursor)
    # 也可以cur = pymysql.cursors.SSCursor(conn)

總之忙灼,在執(zhí)行select等sql語句后

    cur.execute(sql)

可以通過for循環(huán)遍歷cur,此時cur相當于生成器钝侠,不會直接存儲所有數據该园,而是在循環(huán)時一條一條生成數據。

    for i in cur:
        print(i)

或者存儲需要的數據

    l = (i[0] for i in cur)
    # 數據量不大時也可以用列表生成式l = [i[0] for i in cur]

即使只select一種數據帅韧,出現的結果也是元組里初,類似于(1,),而一般需要的數據只是元組里的這個1忽舟,若使用

    l = (i for i in cur)

由于沒有解包元組双妨,得不到想要的結果。

生成器的介紹還是看官方文檔比較好叮阅。
類似于

def func():
    for i in range(3):
        print(i)


func() # 0, 1, 2

要改寫成生成器刁品,只需要把print()變成yield,這個函數本身就可以循環(huán)了浩姥。

def func():
    for i in range(3):
        yield i


for i in func():
    print(i) # 0, 1, 2

生成器只能循環(huán)一次挑随。之后再度對它循環(huán)不會生成值。

    cur.execute(sql)
    l = (i[0] for i in cur)
    r = (i[1] for i in cur)

盡管r不生成任何值勒叠,但上面這段代碼不會報錯兜挨。
如果是這樣

    cur.execute(sql)
    l = [i[0] for i in cur]
    r = [i[1] for i in cur]

調試時會發(fā)現r是一個空列表膏孟。
實際上要達成目的應該老老實實的這樣寫

    cur.execute(sql)
    l, r = [], []
    for i in cur:
        l.append(i[0])
        r.append(i[1])

由于cur本身就是一個生成器,實在不想用上面的寫法的話拌汇,就在for循環(huán)里直接處理i[1]這樣的數據吧柒桑。
相對于list而言,生成器沒有長度的概念噪舀,無法使用len()判斷長度幕垦,因此也不能判空。

def func():
    for i in range(0):
        yield i


if func():
    print(1) # 1


l = (i for i in range(0))
if l:
    print(1) # 1

因此傅联,在執(zhí)行一條select語句后先改,想知道實際有沒有結果,不能用以下方式判斷

    cur.execute(sql)
    if cur:
        for i in cur:
            pass

為了寫入csv等蒸走,需要完整對齊的數據的話仇奶,可以這樣

    cur.execute(sql)
    for i in cur:
        if i:
            l.append(i)
            break
    else:
        l.append('')

很奇怪的for...else...語法,感覺自己在瞎寫了比驻,應該有其他方式來實現该溯,而不是非要用這種邏輯。不過别惦,能抓到老鼠就是好貓狈茉。

要插入幾十萬以上數據想節(jié)省時間的話,可以這樣

    # datas是一個list掸掸,里面又包含幾十萬個list
    bigN = 50000 # 一次插5萬條氯庆,設置的太高mysql也不讓插那么多
    for i in range(len(datas)//bigN):
        l, r = i * bigN, (i + 1) * bigN
        sql = "insert ... values %s"
        sql = sql % ','.join(datas[l:r])
        cur.execute(sql)
        if r + bigN > len(datas):
            sql = "insert ... values %s"
            sql = sql % ','.join(datas[r:]) # 邊界條件,保證尾部元素都能插入
            cur.execute(sql)

不過以上代碼沒有檢查datas長度小于bigN的情況扰付,這個時候由于len(datas)//bigN為0堤撵,是不會進行循環(huán)的,這點也要注意羽莺。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末实昨,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子盐固,更是在濱河造成了極大的恐慌荒给,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刁卜,死亡現場離奇詭異志电,居然都是意外死亡,警方通過查閱死者的電腦和手機长酗,發(fā)現死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門溪北,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事之拨≤约蹋” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵蚀乔,是天一觀的道長烁竭。 經常有香客問我,道長吉挣,這世上最難降的妖魔是什么派撕? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮睬魂,結果婚禮上终吼,老公的妹妹穿的比我還像新娘。我一直安慰自己氯哮,他們只是感情好际跪,可當我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著喉钢,像睡著了一般姆打。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上肠虽,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天幔戏,我揣著相機與錄音,去河邊找鬼税课。 笑死闲延,一個胖子當著我的面吹牛,可吹牛的內容都是我干的伯复。 我是一名探鬼主播慨代,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼啸如!你這毒婦竟也來了?” 一聲冷哼從身側響起氮惯,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤叮雳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后妇汗,有當地人在樹林里發(fā)現了一具尸體帘不,經...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年杨箭,在試婚紗的時候發(fā)現自己被綠了寞焙。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖捣郊,靈堂內的尸體忽然破棺而出辽狈,到底是詐尸還是另有隱情,我是刑警寧澤呛牲,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布刮萌,位于F島的核電站,受9級特大地震影響娘扩,放射性物質發(fā)生泄漏着茸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一琐旁、第九天 我趴在偏房一處隱蔽的房頂上張望涮阔。 院中可真熱鬧,春花似錦灰殴、人聲如沸敬特。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽擅羞。三九已至,卻和暖如春义图,著一層夾襖步出監(jiān)牢的瞬間减俏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工碱工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留娃承,地道東北人。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓怕篷,卻偏偏與公主長得像历筝,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子廊谓,可洞房花燭夜當晚...
    茶點故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內容

  • 1. Java基礎部分 基礎部分的順序:基本語法梳猪,類相關的語法,內部類的語法蒸痹,繼承相關的語法春弥,異常的語法,線程的語...
    子非魚_t_閱讀 31,663評論 18 399
  • 第八章 數據查詢和選擇 ||| 第十章 獲取GIS數據列表和描述信息 我們將在本章中介紹以下幾個案例: 游標對象(...
    muyan閱讀 21,166評論 5 21
  • 測試: http://blog.csdn.net/chenmengyi828/article/details/52...
    Miley_MOJIE閱讀 891評論 0 1
  • 一. Java基礎部分.................................................
    wy_sure閱讀 3,814評論 0 11
  • 體驗 今天公司招聘信息刷爆朋友圈 精進叠荠、點贊爆屏匿沛、別人給你點贊是對你的欣賞是對你的認可、也是一種激勵榛鼎、我要繼續(xù)努力...
    馮祥林閱讀 165評論 0 0