使用Python将多个类型插入到SQLite数据库中

时间:2009-12-26 16:55:45

标签: python sqlite insert

我正在尝试从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插入命令?

3 个答案:

答案 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] )