执行SQL语句并处理结果
创建或修改数据库对象
在使用SQLObject执行数据库操作前需要先建立表的类对象,因为在SQLObject中,一张表对应一个类。用户可以自己创建表,让SQLObject访问这些表。
class Person(SQLObject):
firstName = StringCol()
middleInitial = StringCol(length=1, default=None)
lastName = StringCol()
Person.createTable()
createTable()可以指定参数ifNotExists=True,仅仅在表格不存在时才创建这个表格。
删除数据库对象
删除数据库对象时使用Person.dropTable()函数,可以指定
ifExists=True
,仅仅在表格存在时才删除这个表格。Person.dropTable(ifExists = True) assert not conn.tableExists(Person.sqlmeta.table)
执行更新
插入
Person(firstName = 'John', lastName = 'Doe') Person(firstName = 'Bob', lastName = 'Hope') Person(firstName = 'Doe', lastName = 'Mark')
更新
p = Person.get(1) p.firstName = 'David' p.middleInitial = 'Q' p2 = Person.get(2) p2.set(firstName = 'Robert', lastName = 'Hope Jr.')
删除
Person.deleteMany(OR(Person.q.firstName == 'Bob', Person.q.firstName =='Fred')) Person.deleteBy(firstName = 'Robert')
执行查询
根据ID号查询
调用get()函数根据ID号查询,返回的对象类型是sqlobject.sresults.SelectResults:
peeps = Person.get(1) print(list(peeps))
根据条件查询
查询数据使用相关select函数查询:
p1 = Person.select(OR(Person.q.firstName == 'John', LIKE(Person.q.lastName, '%Hope%'))) print(list(p1)) p2 = Person.selectBy(firstName = 'John')[0] print(p2) p3 = Person.select(Person.q.firstName == 'Doe').count() print(p3)
获取结果
select方法获取到的结果需要先转为列表类型再输出。
peeps = list(p1) for i in peeps: print(i)
处理数据类型
二进制类型
Vastbase G100提供两种不同的方法存储二进制数据。 二进制数据可以使用二进制数据类型 BYTEA存储在表中,或者使用大对象特性以一种特殊的格式将二进制数据存储在一个独立的表中, 然后通过在表中保存一个类型为 OID 的值来引用该表。
以下为BYTEA类型使用示例。
1、创建表
class ImageData(SQLObject): image = BLOBCol(default=b'emptydata',length=256) ImageData.createTable(ifNotExists=True)
2、插入数据。
data = bytes(range(256)) i1 = ImageData(image=data) i1id = i1.id ImageData._connection.cache.clear()
3、读取数据
i2 = ImageData.get(i1id) assert i2.image == data ImageData(image = b'string') assert ImageData.selectBy(image=b'string').count()==1
字符类型
Vastbase G100中TEXT类型与VARCHAR类型都是可变长的字符类型,区别在于VARCHAR类型通过VARCHAR(n)中的n来限制最大长度,而TEXT类型没有。
TEXT类型与VARCHAR类型几乎没有性能差别,TEXT类型最多可存储1G数据。
1、创建表。
class String1(SQLObject): col1 = StringCol()# text类型 col2 = StringCol(length=256)# varchar类型 String1.createTable(ifNotExists=True)
2、插入数据。
a='test1' b='test2' String1(col1=a,col2=b)
3、读取数据。
s1 = String1.get(1) assert s1.col1==a assert s1.col2==b
数字类型
数字类型有整数类型、任意精度数字类型、浮点类型和序数类型。
下面用整数类型integer、任意精度数字类型numeric和double precision举例说明。
1、创建表。
class Number1(SQLObject): col1 = IntCol()# integer类型 col2 = DecimalCol(size=6,precision=4)# numeric类型 col3 = FloatCol()# double precision类型 Number1.createTable(ifNotExists=True)
2、插入数据。
a = 1 b= decimal.Decimal(2.141) c = 3.1415926 Number1(col1=a,col2=b,col3=c)
3、读取数据。
n1=Number1.get(1) print(n1.col1) print(n1.col2) print(n1.col3)
时间/日期类型
日期/时间类型有timestamp 、date、time 、interval。
下面以timestamp 、date、time 举例说明。
1、创建表。
class DateTime1(SQLObject): col1 = DateTimeCol() # timestamp类型 col2 = DateCol() # date类型 col3 = TimeCol() # time类型 DateTime1.createTable(ifNotExixts = True)
2、插入数据。
_now = datetime.now().replace(microsecond = 0) DateTime1(col1=_now,col2=_now,col3=_now.time())
3、读取数据。
dt1=DateTime1.get(1) assert isinstance(dt1.col1,datetime) assert isinstance(dt1.col2,date) assert isinstance(dt1.col3,time)