sqlite3 执行了 insert into 语句,不报错,但没有任何数据写入

2019-03-03 01:32:57 +08:00
 youthfire

初学 sqlite ( python )

已经成功尝试把一些数据转移到 db 中,这次不知什么原因,执行了却没有任何数据过去。

查了一些文档,一般都是没有 commit 导致的,可是我已经 commit 了,其中 value 我用 print 打印看过,内容都有(10 列,4k 行左右)。用数据库查看器看下来的结果就是只有 table f65,以及一排 column name,没有数据内容。

求教各位,预先谢谢。还不会用 markdown,手工尽可能排版了,各位将就看。

df = pd.DataFrame(pd.read_excel(r'/Users/' + username + r'/Documents/working/addf6-5.xlsx', header=0))

df = df.replace('#NUM!', '')

value = chain(reversed(grouplist2), df.values.tolist())

for x in value:

(4 个空格)x[4] = str(x[4])

(4 个空格)x[7] = str(x[7])

conn = sqlite3.connect('veradb.db')

c = conn.cursor()

c.execute("DROP TABLE IF EXISTS f65")

conn.commit()

c.close()

conn.close()

conn = sqlite3.connect('veradb.db')

c = conn.cursor()

c.execute("CREATE TABLE IF NOT EXISTS f65 ('offer', 'code', 'desc', 'engine', 'cost', 'supplier', 'remark', 'podate', 'empty', 'border')")

c.executemany("INSERT INTO f65 VALUES (?,?,?,?,?,?,?,?,?,?)", value)

conn.commit()

c.close()

conn.close()

3338 次点击
所在节点    数据库
12 条回复
mingl0280
2019-03-03 04:57:16 +08:00
你参数都没绑定上去怎么写?写什么?空气么?
shawnxwang
2019-03-03 05:11:32 +08:00
一楼老大哥已经给你答疑解惑了
noqwerty
2019-03-03 06:19:36 +08:00
你这个 4 个空格缩进太灵性了😂
greatbody
2019-03-03 07:41:29 +08:00
其实你可以写在 github 里面,然后扔一个链接的。
youthfire
2019-03-03 10:11:59 +08:00
@mingl0280 抱歉,没有明白哪步还需要参数,能否拨冗指点下?
我其他几个文件都是用几乎一样的语句写完并存完了所有数据,唯一的区别只是 column 的 name 不同。
jingxyy
2019-03-03 11:48:14 +08:00
我没环境 猜一个供 lz debug 参考哈
大概 create table 那句没写对?字段类型都没有这能创建成功吗?
youthfire
2019-03-03 12:03:15 +08:00
@jingxyy #6 字段他默认创建 text 的如果不写
Marsss
2019-03-04 08:28:35 +08:00
可能是 value 的格式不符合要求吧,executemany 要求为元组类型,当你一眼看不出问题在哪里的时候,排除法可以协助分析,比如你自己构造一组测试数据,参考官方文档例子构造,测试以后就可以知道是数据的问题还是数据库表的问题了。
youthfire
2019-03-04 09:56:58 +08:00
@Marsss 谢谢,确实是这个问题。
value = chain(reversed(grouplist2), df.values.tolist())
我尝试了下 print(type(value)), 发现是 <class 'itertools.chain'>
我如果多加一句 value = sorted(value, key=itemgetter(0)),所有数据就写入正常了。
正好我这次相比其他文件,不需要进行排序,所以也就没有形成符合要求的类型。

初学,我并不清楚为什么 value 经过 chain 的合并操作是个 class 而不是 list。包括我调试用 for x in value 来打印 x 的时候感觉也完全跟操作打印 list 中嵌套的 list 展示结果又是符合预期的。
sarlanori
2019-03-04 10:21:19 +08:00
既然楼主已经找到问题了,那我就说个其他问题吧,数据库为什么要打开关闭两次呢?
youthfire
2019-03-04 10:38:23 +08:00
@sarlanori 你好,用 python 处理 csvwriter 时,没有用 with,都是手工 close 的。印象中执行完一组相关的写入操作后,要及时 close,避免后续再次写入相同文件时报错。也是第一次接触数据库,所以就继承过来了,并不清楚是否必要。
sarlanori
2019-03-04 10:46:08 +08:00
@youthfire 在你的这段代码里,drop table、create table 以及 insert into 这三个操作应该算是一组了,我个人觉得只用连接一次数据库即可。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/540459

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX