使用Python将数组传递到Firebird数据库

问题描述 投票:2回答:1

我需要向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,子类型 - 文本。

请告诉我如何将此列表写入数据库以及我应该使用哪种类型的字段?

arrays python-3.x blob firebird firebird2.5
1个回答
1
投票

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中对阵列的支持非常有限,最好避免使用它。

© www.soinside.com 2019 - 2024. All rights reserved.