SQLite3& Py:插入带连字符的字符串

时间:2016-08-31 16:09:04

标签: python sqlite insert-into

我正在做一个简单的脚本,其中Python读取一堆制表符分隔的文件,并逐行将行中的第一项输入到sqlite3表中。除实际数据外,该过程运行良好。发送给我的数据格式为123-4567890-1234567(3-7-7)。我没有看到数据库中的完整字符串,而是获得字符串中三个数字的算术结果,即-5802334。

我尝试了各种带引号的组合,例如Lines[0] = "'" + Lines[0] + "'"(我收到的错误是最后一项是无法识别的令牌)或Lines[0] = Lines[0].replace('-','_')("操作错误:无法识别的令牌:" 114_6555410_7421863")

你能告诉我我做错了什么,和/或如何解决这个问题吗?

这是我的完整代码:

import sqlite3, os, fnmatch, csv, datetime

Homedir = os.path.expanduser('~')
DBFile =  Homedir + '\\Desktop\\AmazonProg\\AmazonOrders.sqlite'
Rawpathin = '\\\\idc-v-lapedi01\\amtu2\\Data\\production\\reports\\'
#TableName = 'OrderNums'
#IdColumn = 'Orderid'
#POColumn = 'PONum'
sTimestamp = datetime.datetime.now().strftime('%Y%m%d%H%M')
Lines = []

conn = sqlite3.connect(DBFile)
c = conn.cursor()

Amzfiles=fnmatch.filter(os.listdir(Rawpathin), 'order*.txt')
for Files in Amzfiles:
    with open(Rawpathin + Files, "r") as Source:
        Reader = csv.reader(Source, delimiter = '\t')
        for Lines in Reader:
            if Lines[0] == 'order-id':
                pass
            elif len(Lines[0])== 19:
                c.execute("INSERT OR IGNORE INTO OrderNums (Orderid, PONum, Timestamp) VALUES ({idf}, {v1}, {v2})".format(idf=Lines[0], v1=Lines[0][12:], v2 = sTimestamp))
            else:
                pass
conn.commit()
conn.close()

提前谢谢你。

1 个答案:

答案 0 :(得分:1)

底线是您不应该使用str.format因为它不安全而且在您的情况下也不会产生您期望的结果。

幸运的是,很久以前这个问题就解决了。对您而言,只需将c.execute行更改为:

c.execute("INSERT OR IGNORE INTO OrderNums (Orderid, PONum, Timestamp)
          VALUES (?,?,?)",(Lines[0],Lines[0][12:],sTimestamp))

审核文档可能是一个好主意 - 包括一些非常有用的示例:

https://docs.python.org/3.5/library/sqlite3.html