Python和SQLite:插入到表中
我有一个列表,其中有3行,每行代表一个表行:Python和SQLite:插入到表中,python,sqlite,list,insert,Python,Sqlite,List,Insert,我有一个列表,其中有3行,每行代表一个表行: >>> print list [laks,444,M] [kam,445,M] [kam,445,M] 如何将此列表插入到表中 我的表格结构是: tablename(name varchar[100], age int, sex char[1]) 分别插入这三个字段可以工作,但使用一行,如 self.cursor.execute(“插入到服务器(服务器,c_id,状态)值(?,,?)”,(t[0],),(t[1],),(t[2],
>>> print list
[laks,444,M]
[kam,445,M]
[kam,445,M]
如何将此列表插入到表中
我的表格结构是:
tablename(name varchar[100], age int, sex char[1])
分别插入这三个字段可以工作,但使用一行,如
self.cursor.execute(“插入到服务器(服务器,c_id,状态)值(?,,?)”,(t[0],),(t[1],),(t[2],)
或
self.cursor.execute(“插入到服务器(服务器,c_id,状态)值(?,?)”,(t),)
不适用。改编自:
有更好的办法
# 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()
不是直接回答,但这里有一个函数,用于将具有列-值对的行插入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})
请注意,表名和列名应事先进行验证。这将适用于数据帧为df且df中列的名称与db相同的多行df
#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!
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()
谢谢Dyno和Dominic-但它不起作用-这是我正在尝试的------------对于列表中的记录:print“-->”,record cursor.execute(“insert-into-process values(?,,?)”,record)----获取错误我有try,except part-try part将有for循环并执行stmt,except part有一条消息说“insert failed”…它只是从except part打印消息并退出。如何更有效地调试它?@lakshmipathi:如果您的异常处理正在处理错误消息,那么它并没有真正处理它…如何打印错误号。。至少这会提供一些提示,除非我们使用conn.commit(),否则不会插入。它现在已经修复。我使用了这个错误的方法self.cursor.execute(“插入到服务器(服务器,c_id,状态)值(?,,?),(t[0],(t[1],),(t[2],)正确的方法是self.cursor.execute(“插入到服务器(服务器,c_id,状态)值(?,,,,,(t[0],t[1],t[2],))我对此有一个查询,因为我已经尝试过了,但我得到了一个错误,说我有6列,只提供了5列的信息。这是真的,但第1列是pk integer,不需要为其提供值。有办法克服这个问题吗?——我明白了。只需像通常一样在db名称后添加字段头。Thx我使用了一种基于包装中此答案的方法,在字段名之前的VAL中“:”是什么意思?以及如何验证名称?请注意,这种方法容易受到SQL注入攻击。
sqlite_insert(conn, 'stocks', {
'created_at': '2016-04-17',
'type': 'BUY',
'amount': 500,
'price': 45.00})
#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!
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()