V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
youthfire
V2EX  ›  数据库

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

  •  
  •   youthfire · 2019-03-03 01:32:57 +08:00 · 3350 次点击
    这是一个创建于 2097 天前的主题,其中的信息可能已经有所发展或是发生改变。

    初学 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()

    12 条回复    2019-03-04 10:46:08 +08:00
    mingl0280
        1
    mingl0280  
       2019-03-03 04:57:16 +08:00
    你参数都没绑定上去怎么写?写什么?空气么?
    shawnxwang
        2
    shawnxwang  
       2019-03-03 05:11:32 +08:00
    一楼老大哥已经给你答疑解惑了
    noqwerty
        3
    noqwerty  
       2019-03-03 06:19:36 +08:00 via Android
    你这个 4 个空格缩进太灵性了😂
    greatbody
        4
    greatbody  
       2019-03-03 07:41:29 +08:00
    其实你可以写在 github 里面,然后扔一个链接的。
    youthfire
        5
    youthfire  
    OP
       2019-03-03 10:11:59 +08:00
    @mingl0280 抱歉,没有明白哪步还需要参数,能否拨冗指点下?
    我其他几个文件都是用几乎一样的语句写完并存完了所有数据,唯一的区别只是 column 的 name 不同。
    jingxyy
        6
    jingxyy  
       2019-03-03 11:48:14 +08:00   ❤️ 1
    我没环境 猜一个供 lz debug 参考哈
    大概 create table 那句没写对?字段类型都没有这能创建成功吗?
    youthfire
        7
    youthfire  
    OP
       2019-03-03 12:03:15 +08:00 via iPhone   ❤️ 1
    @jingxyy #6 字段他默认创建 text 的如果不写
    Marsss
        8
    Marsss  
       2019-03-04 08:28:35 +08:00 via iPhone   ❤️ 1
    可能是 value 的格式不符合要求吧,executemany 要求为元组类型,当你一眼看不出问题在哪里的时候,排除法可以协助分析,比如你自己构造一组测试数据,参考官方文档例子构造,测试以后就可以知道是数据的问题还是数据库表的问题了。
    youthfire
        9
    youthfire  
    OP
       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
        10
    sarlanori  
       2019-03-04 10:21:19 +08:00
    既然楼主已经找到问题了,那我就说个其他问题吧,数据库为什么要打开关闭两次呢?
    youthfire
        11
    youthfire  
    OP
       2019-03-04 10:38:23 +08:00
    @sarlanori 你好,用 python 处理 csvwriter 时,没有用 with,都是手工 close 的。印象中执行完一组相关的写入操作后,要及时 close,避免后续再次写入相同文件时报错。也是第一次接触数据库,所以就继承过来了,并不清楚是否必要。
    sarlanori
        12
    sarlanori  
       2019-03-04 10:46:08 +08:00   ❤️ 1
    @youthfire 在你的这段代码里,drop table、create table 以及 insert into 这三个操作应该算是一组了,我个人觉得只用连接一次数据库即可。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1129 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 22:59 · PVG 06:59 · LAX 14:59 · JFK 17:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.