VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

处理大数据类型

二进制类型

Vastbase G100提供两种不同的方法存储二进制数据。 二进制数据可以使用二进制数据类型 BYTEA存储在表中,或者使用大对象特性以一种特殊的格式将二进制数据存储在一个独立的表中, 然后通过在表中保存一个类型为 OID 的值来引用该表。以下为这两种方法的使用示例。

  • 使用BYTEA类型存储

    1、创建表。

    cursor.execute("create table lo_test_tab (id int, img bytea)")
    

    2、插入数据。

    with open("/data/test.data", 'rb') as file:
    data = file.read()
    cursor.execute("insert into  lo_test_tab values(1, %s)" % psycopg2.Binary(data))
    

    3、读取数据。

    cursor.execute("select img from lo_test_tab where id = 1")
    record = cursor.fetchone()
    byteadata = record[0]
    print(byteadata.tobytes())
    
  • 使用OID存储

    1、创建表。

    cursor.execute("create table lo_test_tab (name text, img oid)")
    

    2、导入数据。

    该步骤会将操作系统文件“image”导入成一个大对象并生成一个oid,查询lo_test_tab表时则显示oid。

    cursor.execute("insert into  lo_test_tab values('beautiful image', lo_import('/tmp/image'))")
    

    3、导出数据。

    该操作将数据库中存储的大对象导出到一个操作系统文件。

    cursor.execute("select lo_export(lo_test_tab.img, '/tmp/image-bak') from lo_test_tab where name = 'beautiful image'")
    

字符类型

Vastbase G100中TEXT类型与VARCHAR类型都是可变长的字符类型,区别在于VARCHAR类型通过VARCHAR(n)中的n来限制最大长度,而TEXT类型没有。TEXT类型与VARCHAR类型几乎没有性能差别,TEXT类型最多可存储1G数据 。

使用TEXT类型存储数据时,可用以下方式来进行读写。

1、创建表。

cursor.execute("create table images (id int, msg text)")

2、插入数据。

cursor.execute("insert into  images  values(1, '%s')" %("the text data"))

3、读取数据。

cursor.execute("select msg from images where id = 1")
record = cursor.fetchone()
byteadata = record[0]

数字类型

数字类型有整数类型、任意精度数字类型、浮点类型和序数类型。下面用整数类型integer、任意精度数字类型numeric、 浮点类型real和double precision举例说明。

(1)创建表

  • 整数类型integer的建表

    cursor.execute("create table test_int(Num int)")
    
  • 任意精度数字类型numeric的建表

    cursor.execute("create table test_numeric(Num numeric)")
    
  • 浮点类型real和double precision的建表

    cursor.execute("create table test_real(Num real)")
    cursor.execute("create table test_doubleprecision(Num double precision)")
    

(2)插入数据

  • 整数类型integer的插入

    cursor.execute("insert into  test_int values(%s)" ,(1,))
    
  • 任意精度数字类型numeric的插入

    cursor.execute("insert into  test_numeric values(%s)" ,(123.456,))
    
  • 浮点类型real和double precision的插入

    # real类型
    cursor.execute("insert into  test_real values(%s)" ,(3.1234,))
    # double precision类型
    cursor.execute("insert into  test_doubleprecison values(%s)" ,(14.1234,))
    

(3)读取数据

  • 整数类型integer的读取

    cursor.execute("select Num from test_int")
    record = cursor.fetchone()
    Num = record[0]
    
  • 任意精度数字类型numeric的读取

    cursor.execute("select Num from test_numeric")
    record = cursor.fetchone()
    Num = record[0]
    
  • 浮点类型real和double precision的读取

    # real类型
    cursor.execute("select Num from test_real")
    record = cursor.fetchone()
    Num = record[0]
    # double precision类型
    cursor.execute("select Num from test_doubleprecision")
    record = cursor.fetchone()
    Num = record[0]
    

时间/日期类型

时间/日期类型有timestamp 、date、time 、interval ;下面以timestamp 、time 举例说明。

(1)创建表

  • timestamp类型

    cursor.execute("create table test_timestamp(dt timestamp)")
    
  • time类型

    cursor.execute("create table test_time(dt time)")
    

(2)插入数据

  • timestamp类型

    cursor.execute("insert into test_timestamp values(%s)" ,(datetime.datetime(2018,10,1,10,30,30),))
    
  • time类型

    cursor.execute("insert into test_time values(%s)" ,(datetime.time(10,30,30),))
    

(3)读取数据

  • timestamp类型

    cursor.execute("select dt from test_timestamp")
    record = cursor.fetchone()
    dt= record[0]
    
  • time类型

    cursor.execute("select dt from test_time")
    record = cursor.fetchone()
    dt= record[0]