我正在做一个小项目,我创建了一个辅助函数,它将一串逗号分隔的值写入数据库,就好像它们是值一样。我意识到这样做会产生影响,但这很小,我需要让它继续下去,直到我能做得更好
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 等...在脚本的其他地方定义。
除非有任何其他明显的明显错误;我需要能够做的(通过这种方法或其他方法,如果有建议)是允许某人创建一个列表,其中每个值代表一个列值。因为我不知道要填充多少列。
所以有人使用它如下:
data = ["null", "foo","bar"]
db_insert("foo_table", data)
这会将数据插入到表名 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