处理大数据类型
二进制类型
Vastbase E100提供两种不同的方法存储二进制数据。二进制数据可以使用二进制数据类型 BYTEA存储在表中,或者使用大对象特性以一种特殊的格式将二进制数据存储在一个独立的表中,然后通过在表中保存一个类型为 OID 的值来引用该表。
为了判断哪种方法比较合适,必须理解每种方法的局限。 BYTEA 数据类型并不适合存储非常大数量的二进制数据。虽然类型为 BYTEA的字段可以存储最多 1G 字节的二进制数据,但是这样它会要求巨大的内存(RAM)来处理这样巨大的数据。用于存储二进制数据的大对象方法更适合存储非常大的数据,但也有自己的局限,具体来说,删除一个引用大数据的行时并不会删除大对象,删除大对象需要单独操作。大对象还有一些安全性的问题,因为连接到数据库的任何用户都可以查看或修改任何大对象,即使他们没有权限查看或修改包含大对象引用的行。
BYTEA
使用BYTEA类型存储二进制数据,例如:
CREATE TABLE lo_test_tab (id int, img bytea);
插入记录
with open("/data/test.data") as file:
data = psycopg2.Binary(file.read())
cur.execute("insert into lo_test_tab values(1, %s)", (data,))
在这里,使用psycopg2.Binary类型存储二进制数据,即可将二进制数据写入。
读取记录
cur.execute("select img FROM lo_test_tab WHERE id = 1")
record = cur.fetchone()
byteadata = record[0]
字符串类型
Vastbase E100中TEXT类型与VARCHAR类型都是可变长的字符串类型,区别在于VARCHAR类型通过VARCHAR(n)中的n来限制最大长度,而TEXT类型没有。TEXT类型与VARCHAR类型几乎没有性能差别,TEXT类型最多可存储1G数据。
使用TEXT类型存储数据时,可用以下方式来进行读写。
例如:
CREATE TABLE images (id int, msg text);
插入记录
cur.execute("insert into images values(1, %s)", ("the text data",));
读取记录
cur.execute("select msg FROM images WHERE id = 1")
record = cur.fetchone()
textdata = record[0]