将变量存储数据插入SQLite3 - Python 3

时间:2018-01-03 22:43:02

标签: python sqlite

我一直在阅读有关如何使用存储在变量中的数据将数据插入数据库的信息。我无法将数据加载到我的数据库中,我不确定原因。

编写程序是为了检查现有数据库,如果它不存在而不是创建它以及所需的表和列,那么一切正常。

我试图按照我一直在阅读的各种教程中的方法,但我必须遗漏某些内容或做错事。

数据库和表格正确创建(我没有包含代码的那部分,它是在程序开始时执行的)。继续我的程序代码,我使用以下例程通过单击“提交”按钮

输入用户输入数据

按钮例程:

submit = Button(
    window3, 
    font=('arial',12,'bold'), text='Submit', 
    width=12, height=1, bg='aliceblue', 
    fg='steel blue', command = Submit
)

我的提交例程:

def Submit():
    connect = sqlite3.connect('SSRB.db')
    connect.execute('''
    INSERT INTO ssrb (date, time_in, time_out, company, plate, province, driver, pass1,
     pass2, pass3, deliver, contact, entry_by, pi_yes, pi_no, pi_violations, pi_done_by,
     vi_yes, vi_no, vi_violations, vi_done_by)
    VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,
     %s), (Date, TimeIn, TimeOut, Company, Plate, Province, Driver, Pass1, Pass2, Pass3,
     Delivery, Contact, EntryBy, PIYES, PINO, PIFound, PIDoneBy, VIYES, VINO,
    VIFound, VIDoneBy)
    ''')
    connect.commit()
    connect.close()

表中的列在INSERT之后列出,%s放在VALUES之后,持有用户输入的变量列在最后。

我没有看到我出错的地方......有人可以指出我做错了什么吗?

一如既往地非常感谢。

2 个答案:

答案 0 :(得分:0)

请参阅sqlite documentation

中的执行功能说明

语句变量应该在执行(...)的第二个参数中,这是一个包含所有参数的元组。

根据文档规范,将语句字符串中的%s替换为?,以获得理智。

您需要这样的代码:

def Submit():
    conn = sqlite3.connect('SSRB.db')
    conn.execute('''
    INSERT INTO ssrb (date, time_in, time_out, company, plate, province, driver, pass1, 
    pass2, pass3, deliver, contact, entry_by, pi_yes, pi_no,  pi_violations, pi_done_by, 
    vi_yes, vi_no, vi_violations, vi_done_by)
    VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)''', 
    (Date, TimeIn, TimeOut, Company, Plate, Province, Driver, Pass1, Pass2, Pass3, 
    Delivery, Contact, EntryBy, PIYES, PINO, PIFound, PIDoneBy, VIYES, VINO, VIFound, 
    VIDoneBy))
    connect.commit()
    connect.close()

附录1 :参数元组中的变量应该是基元(整数,浮点数等)。

答案 1 :(得分:0)

而不是

connect.execute('''
INSERT INTO ssrb (date, time_in, time_out, company, plate, province, driver, pass1,
 pass2, pass3, deliver, contact, entry_by, pi_yes, pi_no, pi_violations, pi_done_by,
 vi_yes, vi_no, vi_violations, vi_done_by)
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,
 %s), (Date, TimeIn, TimeOut, Company, Plate, Province, Driver, Pass1, Pass2, Pass3,
 Delivery, Contact, EntryBy, PIYES, PINO, PIFound, PIDoneBy, VIYES, VINO,
VIFound, VIDoneBy)
''')

使用

connect.execute('''
INSERT INTO ssrb (date, time_in, time_out, company, plate, province, driver, pass1,
 pass2, pass3, deliver, contact, entry_by, pi_yes, pi_no, pi_violations, pi_done_by,
 vi_yes, vi_no, vi_violations, vi_done_by)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
 ?)''', (Date, TimeIn, TimeOut, Company, Plate, Province, Driver, Pass1, Pass2, Pass3,
 Delivery, Contact, EntryBy, PIYES, PINO, PIFound, PIDoneBy, VIYES, VINO,
VIFound, VIDoneBy)
)

他们有2个不同之处:

  1. 符号?而不是%s,因为它不是Python的.format()方法(或更早的%表示法)的语法但 DB-API的参数替换符号
  2. 结束'''向上移动 - INSERT INTO(参数化)语句确实结束。
    (替换本身由.execute()方法通过 2 nd 参数 - 由您提供的元组来执行。)