我需要向Firebird 2.5数据库写一个包含以下内容的列表:[ - 0.09143443,0.09187854,-0.0907896,...]根据使用指南FDB 1.7执行所有操作:
import fdb
con = fdb.connect(dsn='localhost:/temp/test.db', user='sysdba', password='materkey')
cur = con.cursor()
arrayIn = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
print ('arrayIn: %s' % (arrayIn))
cur.execute("insert into FACE_REC (ID, ARRAY) values (?, ?)", ('5', arrayIn))
cur.execute("select a from FACE_REC")
arrayOut = cur.fetchone()[0]
print ('arrayOut: %s' % (arrayOut))
con.commit()
之后我收到一个错误:
TypeError: [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
在数据库字段中ARRAY类型:BLOB大小 - 4096,子类型 - 文本。
请告诉我如何将此列表写入数据库以及我应该使用哪种类型的字段?
blob sub_type text
不是数组数据类型,它是字符串数据类型。在将数组传递给execute
之前,需要将数组转换为合适的字符串表示形式。这也意味着您需要在检索时将字符串表示转换回数组。
Firebird也有一个数组数据类型,但这并没有得到很好的支持,但FDB似乎对此有所支持。如果您确实需要或需要使用数组,您还可以尝试将列声明为数组类型。根据显示的数据,您需要将列声明为integer[3,4]
,如FDB 2.0文档中所示,Firebird ARRAY datatype部分:
import fdb con = fdb.connect(dsn='localhost:/temp/test.db', user='sysdba', password='pass') con.execute_immediate("recreate table array_table (a int[3,4])") con.commit() cur = con.cursor() arrayIn = [ [1, 2, 3, 4], [5, 6, 7, 8], [9,10,11,12] ] print 'arrayIn: %s' % arrayIn cur.execute("insert into array_table values (?)", (arrayIn,)) cur.execute("select a from array_table") arrayOut = cur.fetchone()[0] print 'arrayOut: %s' % arrayOut con.commit()
看起来您使用该代码作为代码示例的基础,但您似乎错过了列数据类型的声明(请参阅顶部附近的recreate table
语句)。
但是,Firebird中对阵列的支持非常有限,最好避免使用它。