【问题标题】:Initializing multiple rows of an SQLite3 database初始化 SQLite3 数据库的多行
【发布时间】:2019-11-29 11:33:14
【问题描述】:

我有一个简单的两列数据库表,第一列是灯泡id,第二列是整数status (0/1),表示灯是否亮着。默认情况下,我所有的电灯开关都被假定为关闭。灯泡的数量是固定的,我只需要改变每一行的id。

这是我的桌子:

cursor.execute(
    '''
    CREATE TABLE IF NOT EXISTS info(
    id integer,
    status integer
    )
    '''

)

有什么比手动列出每一行更好的初始化表格的方法? (我知道灯的数量固定为10)。

c.execute('INSERT INTO info VALUES(1,0)')
c.execute('INSERT INTO info VALUES(2,0)')
c.execute('INSERT INTO info VALUES(3,0)')

....

....
c.execute('INSERT INTO info VALUES(10,0)')

【问题讨论】:

标签: python python-3.x sqlite sql-insert


【解决方案1】:

而不是这个create 声明:

CREATE TABLE IF NOT EXISTS info(
  id integer,
  status integer
)

因为您希望 ids 具有值 1-10 使 id primary key (因此它将是 auto increment1 开始)和列状态具有默认值 @ 987654329@:

CREATE TABLE IF NOT EXISTS info(
  id integer primary key,
  status integer default 0
)

现在,当您要插入新行时,您所要做的就是执行以下语句:

insert into info default values;

这将插入一行,其中包含下一个 id(对于新表,id 将从 1 开始)和 status=0
所以使用循环插入10行:

for i in range(1, 11):
    c.execute('insert into info default values')

【讨论】:

    【解决方案2】:

    您不需要在数据库中进行任何操作,只需使用range(1,11) 在应用程序中进行迭代以生成从 1 到 10 的整数:

    ....
    c = con.cursor()
    ....
    for i in range(1,11):
        c.execute('INSERT INTO info VALUES(?,0)',(i,))
    
    con.commit()
    

    【讨论】:

    • 最好使用VALUES(?) 并将db 插值作为一种习惯。请参阅文档:docs.python.org/3/library/sqlite3.html
    • 感谢@chthonicdaemon 的警告。我认为您特别指的是针对注入的漏洞...
    猜你喜欢
    • 2018-04-18
    • 2020-01-12
    • 2016-02-19
    • 2014-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-22
    • 2012-01-12
    相关资源
    最近更新 更多