【问题标题】:Python and SQLite: insert into tablePython 和 SQLite:插入表
【发布时间】:2010-01-19 10:31:36
【问题描述】:

我有一个包含 3 行的列表,每行代表一个表格行:

>>> print list
[laks,444,M]
[kam,445,M]
[kam,445,M]

如何将此列表插入到表格中?

我的表结构是:

表名(名称 varchar[100],年龄 int,性别 char[1])

或者我应该使用列表以外的东西吗?

这是实际的代码部分:

    for record in self.server:
        print "--->",record
        t=record
        self.cursor.execute("insert into server(server) values (?)",(t[0],));
        self.cursor.execute("insert into server(id) values (?)",(t[1],))
        self.cursor.execute("insert into server(status) values (?)",(t[2],));

分别插入三个字段,但使用单行

self.cursor.execute("insert into server(server,c_id,status) values (?,?,?)",(t[0],),(t[1],),(t[2],))

self.cursor.execute("insert into server(server,c_id,status) values (?,?,?)",(t),)

没有。

【问题讨论】:

  • 现在已修复。我使用了这个错误的方法 self.cursor.execute("insert into server(server,c_id,status) values (?,?,?)",(t[0],),(t[1],),( t[2],)) 正确的方法是 self.cursor.execute("insert into server(server,c_id,status) values (?,?,?)",(t[0],t[1],t[ 2],))

标签: python sqlite list insert


【解决方案1】:
conn = sqlite3.connect('/path/to/your/sqlite_file.db')
c = conn.cursor()
for item in my_list:
  c.execute('insert into tablename values (?,?,?)', item)

【讨论】:

  • 感谢 Dyno 和 Dominic - 但它不起作用 - 这就是我正在尝试的 ----------- 记录在列表中:打印“--->”,记录cursor.execute("插入进程值 (?,?,?)",record); ------------ 出现错误
  • 我已经尝试,除了部分 - 尝试部分将有 for 循环并执行 stmt,并且除了部分有一条消息说“插入失败”......它只是打印来自除外部分的消息并退出。如何更有效地调试?
  • @lakshmipathi:如果您的异常处理正在处理错误消息,那么它并没有真正处理它......
  • 如何打印错误号 .. 至少可以提供一些提示
  • 除非我们使用 conn.commit() 否则它不会插入
【解决方案2】:

还有更好的方法

# Larger example
rows = [('2006-03-28', 'BUY', 'IBM', 1000, 45.00),
        ('2006-04-05', 'BUY', 'MSOFT', 1000, 72.00),
        ('2006-04-06', 'SELL', 'IBM', 500, 53.00)]
c.executemany('insert into stocks values (?,?,?,?,?)', rows)
connection.commit()

【讨论】:

  • 我对此有一个疑问,因为我已经尝试过了,但我收到错误消息说我有 6 列并且只提供了 5 列的信息。这是真的,但第一列是 pk 整数,而你没有不需要为它提供一个值。有没有办法克服这个问题? ——
  • 想通了。只需像往常一样在数据库名称后添加字段标题。
  • 谢谢,我在包装器 github.com/WolfgangFahl/DgraphAndWeaviateTest/blob/master/… 中使用了基于此答案的方法
  • @WolfgangFahl 的包装现在可以是found here
  • @tanius thx 感谢我的评论 - 事实上现在有一个库 pyLoDStorage 有代码并且可以通过 pypi github.com/WolfgangFahl/pyLoDStorage/blob/master/lodstorage/… 集成
【解决方案3】:

不是一个直接的答案,但这是一个将带有列值对的行插入到 sqlite 表中的函数:

def sqlite_insert(conn, table, row):
    cols = ', '.join('"{}"'.format(col) for col in row.keys())
    vals = ', '.join(':{}'.format(col) for col in row.keys())
    sql = 'INSERT INTO "{0}" ({1}) VALUES ({2})'.format(table, cols, vals)
    conn.cursor().execute(sql, row)
    conn.commit()

使用示例:

sqlite_insert(conn, 'stocks', {
        'created_at': '2016-04-17',
        'type': 'BUY',
        'amount': 500,
        'price': 45.00})

请注意,表名和列名应事先验证。

【讨论】:

  • 字段名前的 vals 中的 ':' 是什么意思?以及如何验证名称?
【解决方案4】:

改编自http://docs.python.org/library/sqlite3.html

# Larger example
for t in [('2006-03-28', 'BUY', 'IBM', 1000, 45.00),
          ('2006-04-05', 'BUY', 'MSOFT', 1000, 72.00),
          ('2006-04-06', 'SELL', 'IBM', 500, 53.00),
         ]:
    c.execute('insert into stocks values (?,?,?,?,?)', t)

【讨论】:

    【解决方案5】:

    这将适用于数据帧为 df 且 df 中的列名称与 db 相同的多行 df。

    tuples = list(df.itertuples(index=False, name=None))
    
    columns_list = df.columns.tolist()
    marks = ['?' for _ in columns_list]
    columns_list = f'({(",".join(columns_list))})'
    marks = f'({(",".join(marks))})'
    
    table_name = 'whateveryouwant'
    
    c.executemany(f'INSERT OR REPLACE INTO {table_name}{columns_list} VALUES {marks}', tuples)
    conn.commit()
    

    【讨论】:

      【解决方案6】:
      #The Best way is to use `fStrings` (very easy and powerful in python3)   
      #Format: f'your-string'   
      #For Example:
      
      mylist=['laks',444,'M']
      
      cursor.execute(f'INSERT INTO mytable VALUES ("{mylist[0]}","{mylist[1]}","{mylist[2]}")')
      
      #THATS ALL!! EASY!!
      #You can use it with for loop!
      

      【讨论】:

      • 请注意,这种方法容易受到 SQL 注入攻击。
      猜你喜欢
      • 2014-02-05
      • 2019-03-27
      • 2023-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-20
      • 2019-02-11
      相关资源
      最近更新 更多