我正在尝试从Python创建一个SQLite 3数据库。我有几种类型我想插入每个记录:一个浮点数,然后是3组n个浮点数,目前是一个元组但可能是一个数组或列表..我不够精通Python了解所有的差异。我的问题是INSERT语句。
DAS = 12345
lats = (42,43,44,45)
lons = (10,11,12,13)
times = (1,2,3,4,5,6,7,8,9)
import sqlite3
connection = sqlite3.connect("test.db")
cursor = connection.cursor()
cursor.execute( "create table foo(DAS LONG PRIMARY KEY,lats real(4),lons real(4), times real(9) )" )
我不确定接下来会发生什么。有点像:
cmd = 'INSERT into foo values (?,?,?,?), ..."
cursor.execute(cmd)
如果给出这些数据,我应该如何最好地构建SQL插入命令?
答案 0 :(得分:1)
类型real(4)
并不意味着4个实数的数组/列表/元组; 4改变了'真实'类型。但是,SQLite主要忽略列类型,因为它的清单类型,但它们仍然会影响column affinity。
您有几个选项,例如存储文本表示(来自repr)或使用四列,每列一个。
您可以使用Python SQLite library提供的各种钩子来修改它,以便为您处理一些转换,但是单独的列(具有本地化和处理各种语句的函数,所以您不要重复自己)是如果你需要搜索/等等,可能最容易使用。在SQL中的每个值。
如果存储文本表示,ast.literal_eval(或eval,在特殊条件下)将转换回Python对象。
答案 1 :(得分:0)
这样的事情:
db = sqlite3.connect("test.db")
cursor = db.cursor()
cursor.execute("insert into foo values (?,?,?,?)", (val1, val2, val3, val4))
db.commit() # Autocommit is off by default (and rightfully so)!
请注意,我不使用字符串格式将实际数据注入查询,而是让库为我做这项工作。这样就可以正确引用和转发数据。
编辑:显然,考虑到您的数据库架构,它不起作用。尝试将集合类型值存储在 sqlite 数据库的单个字段中是不切实际的。如果我理解正确,您应该为您在单行中存储的每个值创建一个单独的列。当然,这将是很多专栏,但这是最自然的方式。
答案 2 :(得分:0)
(一个月后),两步:
平坦的DAS把很多次列入一长列表,比如长18
2.生成“插入表名xx(?,?,... 18个问号)”并执行该操作。
Test = 1
def flatten( *args ):
""" 1, (2,3), [4,5] -> [1 2 3 4 5] """
# 1 level only -- SO [python] [flatten] zzz
all = []
for a in args:
all.extend( a if hasattr( a, "__iter__" ) else [a] )
if Test: print "test flatten:", all
return all
def sqlinsert( db, tablename, *args ):
flatargs = flatten( *args ) # one long list
ncol = len(flatargs)
qmarks = "?" + (ncol-1) * ",?"
insert = "Insert into tablename %s values (%s)" % (tablename, qmarks)
if Test: print "test sqlinsert:", insert
if db:
db.execute( insert, flatargs )
# db.executemany( insert, map( flatargs, rows ))
return insert
#...............................................................................
if __name__ == "__main__":
print sqlinsert( None, "Table", "hidiho", (4,5), [6] )