簡體   English   中英

python中的sqlite查詢僅使用對象將最后一行寫入文件

[英]sqlite query in python writes only last row to file using objects

首先,在過去的幾個月中,我是Python的新手,直到現在,它的運行情況還不錯。 但是我很困惑,我非常想通過顯示器砸一下頭。

當我運行此腳本時,我只會將最后一行數據寫入文件,而我需要的是所有數據行都將以類部分中的格式寫入。

VOL_HOURS.db有多個行,但只有最后一行被寫入。 這是我的腳本:

    from vlist import VLIST

import sqlite3
import decimal
import os
import sys
import uuid

VERSION = "oops"
DEVICE_SOFTWARE_VERSION = "OOPS"
FILENAME = "VHOURS.txt"
conn = sqlite3.connect("VOL_HOURS.db")






def fromVolunteers():
    conn = sqlite3.connect("VOL_HOURS.db")


with conn:

    cur = conn.cursor()
    cur.execute("SELECT BOB, DAVE, CAROL, ANDY, CARL, DANNY, CHERYL, CYNTHIA, TARA, SCOTT, ASHLEY, CRYSTAL FROM VOLUNTEERS")
    rows = cur.fetchall()




for row in rows:
    bob = row[0] 
    dave = row[1]
    carol = row[2]
    andy= row[3]
    carl = row[4]
    danny = row [5]
    cheryl = row [6]
    cynthia = row [7]
    tara = row [8]
    scott = row [9]
    ashley = row [10]
    crystal = row [11]



def main():
    fromVolunteers()
    testOutput = open(FILENAME, "w+")

    vlist = VLIST()
    vlist.setBob(bob)
    vlist.setDave(dave)
    vlist.setCarol(carol)
    vlist.setAndy(andy)
    vlist.setCarl(carl)
    vlist.setDanny(danny)
    vlist.setCheryl(cheryl)
    vlist.setCynthia(cynthia)
    vlist.setTara(tara)
    vlist.setScott(scott)
    vlist.setAshley(ashley)
    vlist.setCrystal(crystal)

    vlist.dump_object(testOutput)

    testOutput.flush()
    testOutput.close()
cur.close()
conn.close()

if __name__ == "__main__":
    sys.exit(main())

它從中提取的類文件是:

class VLIST:

    def __init__(self):
        self.bob = ""
        self.dave = ""
        self.carol = ""
        self.andy = ""
        self.carl = ""
        self.danny = ""
        self.cheryl = ""
        self.cynthia = ""
        self.tara = ""
        self.scott = ""
        self.ashley = ""
        self.crystal = ""

    def setBob(self,bob):
        self.bob = bob
        return

    def setDave(self,dave):
        self.dave = dave
        return

    def setCarol(self,carol):
        self.carol = carol
        return

    def setAndy(self,andy):
        self.andy = andy
        return

    def setCarl(self,carl):
        self.carl = carl
        return

    def setDanny(self,danny):
        self.danny = danny
        return

    def setCheryl(self,cheryl):
        self.cheryl = cheryl
        return

    def setCynthia(self,cynthia):
        self.cynthia = cynthia
        return

    def setTara(self,tara):
        self.tara = tara
        return

    def setScott(self,scott):
        self.scott = scott
        return

    def setAshley(self,ashley):
        self.ashley = ashley
        return

    def setCrystal(self,crystal):
        self.crystal = crystal
        return

    def dump_object(self,testOutput):
        testOutput.write("VLIST,"+self.bob+","+self.dave+","+self.carol+","+self.andy+","+self.carl+","+self.danny+","+self.cheryl+","+self.cynthia+","+self.tara+","+self.scott+","+self.ashley+","+self.crystal+","+"\n")

如果這令人困惑,我會提前道歉,就像我說過的那樣。 感謝您的時間。

for row in rows:迭代for row in rows:您只是覆蓋了變量bobdave等的先前值。因此,在迭代結束時,這些變量只有最后一個值。

fromVolunteers()刪除迭代。 此函數應僅設置rows變量,並將迭代放在main函數中:

import sqlite3
import decimal
import os
import sys
import uuid

VERSION = "oops"
DEVICE_SOFTWARE_VERSION = "OOPS"
FILENAME = "VHOURS.txt"
conn = sqlite3.connect("VOL_HOURS.db")

def fromVolunteers():
    conn = sqlite3.connect("VOL_HOURS.db")

    with conn:
        cur = conn.cursor()
        cur.execute("SELECT BOB, DAVE, CAROL, ANDY, CARL, DANNY, CHERYL, CYNTHIA, TARA, SCOTT, ASHLEY, CRYSTAL FROM VOLUNTEERS")
        rows = cur.fetchall()
def main():
    fromVolunteers()
    testOutput = open(FILENAME, "w+")

    for row in rows:
        vlist = VLIST()
        vlist.setBob(row[0])
        vlist.setDave(row[1])
        vlist.setCarol(row[2])
        vlist.setAndy(row[3])
        vlist.setCarl(row[4])
        vlist.setDanny(row[5])
        vlist.setCheryl(row[6])
        vlist.setCynthia(row[7])
        vlist.setTara(row[8])
        vlist.setScott(row[9])
        vlist.setAshley(row[10])
        vlist.setCrystal(row[11])
        vlist.dump_object(testOutput)

testOutput.flush()
testOutput.close()
cur.close()
conn.close()

這是代碼的重構版本。 不知道您的數據庫模式,數據庫內容或要測試的示例文件,這只是您可以做的近似。 隨着VOLUNTEERS表繼續添加或刪除列,您只需要更改代碼頂部的COLUMNS元組即可補償COLUMNS的更改。

import contextlib
import sqlite3


DATABASE = 'VOL_HOURS.db'
OUTPUT = 'VHOURS.nmf'
COLUMNS = ('BOB', 'DAVE', 'CAROL', 'ANDY', 'CARL', 'DANNY', 'CHERYL',
           'CYNTHIA', 'TARA', 'SCOTT', 'ASHLEY', 'CRYSTAL')


def main():
    with open(OUTPUT, 'w') as file:
        for row in from_volunteers():
            file.write(str(VolunteerList.new(row)))


def from_volunteers():
    with sqlite3.connect(DATABASE) as connection:
        with contextlib.closing(connection.cursor()) as cursor:
            query = 'SELECT {} FROM VOLUNTEERS'.format(', '.join(COLUMNS))
            cursor.execute(query)
            return cursor.fetchall()


class VolunteerList:

    @classmethod
    def new(cls, row):
        obj = cls()
        for key, value in zip(COLUMNS, row):
            obj[key] = value
        return obj

    def __init__(self):
        self.__data = [''] * len(COLUMNS)

    def __setitem__(self, key, value):
        self.__data[COLUMNS.index(key.upper())] = value

    def __str__(self):
        return ','.join(['VLIST'] + self.__data + ['\n'])


if __name__ == '__main__':
    main()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM