Python 写多列到 sqlite
Posted
技术标签:
【中文标题】Python 写多列到 sqlite【英文标题】:Python Write a number of columns to sqlite 【发布时间】:2012-10-22 18:00:29 【问题描述】:我正在做一个小项目,我创建了一个辅助函数,它将一串逗号分隔的值写入数据库,就好像它们是值一样。我意识到这样做会有影响,但这很小,我需要继续努力,直到我能做得更好
def db_insert(table,data):
"""
insert data into a table, the data should be a tuple
matching the number of columns with null for any columns that
have no value. False is returned on any error, error is logged to
database log file."""
if os.path.exists(database_name):
con = lite.connect(database_name)
else:
error = "Database file does not exist."
to_log(error)
return False
if con:
try:
cur = con.cursor()
data = str(data)
cur.execute('insert into %s values(%s)') % (table, data)
con.commit()
con.close()
except Exception, e:
pre_error = "Database insert raised and error;\n"
thrown_error = pre_error + str(e)
to_log(thrown_error)
finally:
con.close()
else:
error = "No connection to database"
to_log(error)
return False
database_name 等...在脚本的其他地方定义。
除非有任何其他明显的明显错误; 我需要能够做的(通过这种方法或其他方法,如果有建议)是允许某人创建一个列表,其中每个值代表一个列值。因为我不知道要填充多少列。
所以有人这样使用它: 数据 = ["null", "foo","bar"] db_insert("foo_table", 数据)
这会将数据插入到表名 foo_table 中。用户可以知道表中有多少列,并提供正确数量的元素来满足这一点。 我意识到最好使用 sqlite 参数,但有两个问题。 首先,您不能使用参数仅指定表中的值。 其次是你需要知道你提供了多少价值。你所要做的;
cur.execute('插入表值(?,?,?), val1,val2,val3)
您需要能够指定三个? 我正在尝试编写一个通用函数,该函数允许我获取任意数量的值并将它们插入到任意表名中。 现在,在我尝试将“null”作为值传递之前,它的工作相对正常。 其中一列是主键并具有自动增量。所以传入 null 将允许它自动递增。还有其他需要空值的情况。 问题是python一直将我的null用单引号括起来,sqlite抱怨它是数据类型不匹配,因为主键是一个整数字段。如果我尝试将 None 作为 python null 等效项传递,则会发生同样的事情。 所以有两个问题。
如何插入任意数量的列。 如何传递一个空值。
感谢您对这个问题和过去问题的所有帮助。
抱歉,这似乎与此重复 Using Python quick insert many columns into Sqlite\mysql
很抱歉,直到我写完这篇文章后才找到它。
结果如下:
def db_insert(table,data):
"""
insert data into a table, the data should be a tuple
matching the number of columns with null for any columns that
have no value. False is returned on any error, error is logged to
database log file."""
if os.path.exists(database_name):
con = lite.connect(database_name)
else:
error = "Database file does not exist."
to_log(error)
return False
if con:
try:
tuple_len = len(data)
holders = ','.join('?' * tuple_len)
sql_query = 'insert into %s values(0)'.format(holders) % table
cur = con.cursor()
#data = str(data)
#cur.execute('insert into readings values(%s)') % table
cur.execute(sql_query, data)
con.commit()
con.close()
except Exception, e:
pre_error = "Database insert raised and error;\n"
thrown_error = pre_error + str(e)
to_log(thrown_error)
finally:
con.close()
else:
error = "No connection to database"
to_log(error)
return False
【问题讨论】:
让你的函数使用 **kwargs。 docs.python.org/tutorial/controlflow.html#keyword-arguments 【参考方案1】:第二个问题是“为我工作”。当我将 None 作为值传递时,它会正确地将该值与 db 来回转换。
import sqlite3
conn = sqlite3.connect("test.sqlite")
data = ("a", None)
conn.execute('INSERT INTO "foo" VALUES(' + ','.join("?" * len(data)) + ')', data)
list(conn.execute("SELECT * FROM foo")) # -> [("a", None)]
【讨论】:
你应该用双引号括起你的表名 moter,现在我正在使用连接来添加额外的?它现在也为我工作。我认为我的角色也可能存在字符串/元组混淆。谢谢你的评论。非常感谢。以上是关于Python 写多列到 sqlite的主要内容,如果未能解决你的问题,请参考以下文章
想问一下python输出表格其中1列或多列需要设置为文本格式,代码怎么写?