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

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

  •  
  •   youthfire · 83 天前 · 1641 次点击
    这是一个创建于 83 天前的主题,其中的信息可能已经有所发展或是发生改变。

    初学 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
        1
    mingl0280   83 天前
    你参数都没绑定上去怎么写?写什么?空气么?
        2
    shawnxwang   83 天前
    一楼老大哥已经给你答疑解惑了
        3
    noqwerty   83 天前 via Android
    你这个 4 个空格缩进太灵性了😂
        4
    greatbody   83 天前
    其实你可以写在 github 里面,然后扔一个链接的。
        5
    youthfire   83 天前
    @mingl0280 抱歉,没有明白哪步还需要参数,能否拨冗指点下?
    我其他几个文件都是用几乎一样的语句写完并存完了所有数据,唯一的区别只是 column 的 name 不同。
        6
    jingxyy   83 天前   ♥ 1
    我没环境 猜一个供 lz debug 参考哈
    大概 create table 那句没写对?字段类型都没有这能创建成功吗?
        7
    youthfire   83 天前 via iPhone   ♥ 1
    @jingxyy #6 字段他默认创建 text 的如果不写
        8
    Marsss   82 天前 via iPhone   ♥ 1
    可能是 value 的格式不符合要求吧,executemany 要求为元组类型,当你一眼看不出问题在哪里的时候,排除法可以协助分析,比如你自己构造一组测试数据,参考官方文档例子构造,测试以后就可以知道是数据的问题还是数据库表的问题了。
        9
    youthfire   82 天前
    @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 展示结果又是符合预期的。
        10
    sarlanori   82 天前
    既然楼主已经找到问题了,那我就说个其他问题吧,数据库为什么要打开关闭两次呢?
        11
    youthfire   82 天前
    @sarlanori 你好,用 python 处理 csvwriter 时,没有用 with,都是手工 close 的。印象中执行完一组相关的写入操作后,要及时 close,避免后续再次写入相同文件时报错。也是第一次接触数据库,所以就继承过来了,并不清楚是否必要。
        12
    sarlanori   82 天前   ♥ 1
    @youthfire 在你的这段代码里,drop table、create table 以及 insert into 这三个操作应该算是一组了,我个人觉得只用连接一次数据库即可。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2367 人在线   最高记录 5043   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 18ms · UTC 09:30 · PVG 17:30 · LAX 02:30 · JFK 05:30
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1