【问题标题】:Reading changes with dbf library in python在 python 中使用 dbf 库读取更改
【发布时间】:2014-12-03 16:50:24
【问题描述】:

我正在尝试制作一个程序,该程序在 dbf 文件中进行更改然后上传它们。我已经得到它来读取dbf 文件并将它们上传到mysql 数据库,但它需要50 分钟的上传时间。我试图让它只上传已更改的字段。我遇到的问题是我似乎需要关闭并重新打开dbf 文件。如果有人在执行此操作时进行了更改,它不会注意到有更改。

有没有更好/正确的方法:

import time
import dbf
import MySQLdb
import os

source_path = r"\\path\to\file"
file_name = "\\test.Dbf"

print "Found Source DBF"

source = dbf.Table(source_path + file_name)
source.open()

print "Opened DBF"

updated = list(source)
print "Copied Source"

db = MySQLdb.connect(host = "myHost.com", port=3306, user = "user", passwd = "pass", db = "database")
cur = db.cursor()
print "Connected to database"

try:
        cur.execute("DROP TABLE IF EXISTS dbftomysql")
except:
        db.rollback()

print "Dropped old table"

sql = """CREATE TABLE table(
        col1 VARCHAR(200) NOT NULL,
        col2 VARCHAR(200),
        col3 VARCHAR(200),
        col4 NUMERIC(15,2),
        col5 VARCHAR(200) )"""

cur.execute(sql)

print "Created new table"

for i, s in zip(source, updated):
        query = """INSERT table SET col1 = %s, col2 = %s, col3 = %s, col4 = %s, col5 = %s"""
        values = (i["col1"], i ["col2 "], i["col3"], i["col4"], i["col5"])
        cur.execute(query, values)
        db.commit()
        print i["col1"], i ["col2 "], i["col3"], i["col4"], i["col5"]
print "First Upload Completed"

while True:
        for i, s in zip(source, updated):
                if i["col1"] != s["col1"]:
                        print i["col1"] + " col1Updated"
                        query = """UPDATE table SET col1= %s WHERE col1= %s"""
                        values = (i["col1"], s["col1"])
                        try:
                                cur.execute(query, values)
                                db.commit()
                        except:
                                db.rollback()
                                print "No connection to database"

                if i["col2"] != s["col2"]:
                        print i["col2"] + " col2 Updated for " + i["col1"]
                        query = """UPDATE table SET col2 = %s WHERE col1= %s OR col1= %s"""
                        values = (i["col2"], i["col1"], s["col1"])
                        try:
                                cur.execute(query, values)
                                db.commit()
                        except:
                                db.rollback()
                                print "No connection to database"
                        #ect

        updated = list(source)
        source.close()
        source.open()                     
        time.sleep(0.2)

【问题讨论】:

    标签: python mysql dbf


    【解决方案1】:

    dbf 库只会从内存中不存在的 dbf 文件中获取记录;当你这样做时

    updated = list(source)
    

    您实际上冻结了所有行,因为updated 是一个记录列表(不是lists 列表或tuples 列表;这意味着当您稍后尝试比较sourceupdated你正在比较相同的数据。

    为了使updated 成为与source 分开的实体,请尝试

    updated = [tuple(row) for row in source]
    

    这会给你一个元组列表,或者

    updated = [scatter(row, dict) for row in source]
    

    这将为您提供一个字典列表,这是您进一步向下的字段比较代码所需要的。

    【讨论】:

    • 感谢您的回复。我添加了它,现在我得到一个错误。 tuple indices must be integers, not str。我有点理解它告诉我的内容,但不知道如何实现它。此外,在上传字段后,我是否需要做类似s['col1'] = i['col1'] 之类的操作
    • @ChrisMeek:更新答案。
    猜你喜欢
    • 2014-07-31
    • 2021-12-25
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-08
    • 1970-01-01
    • 2023-04-01
    相关资源
    最近更新 更多