Python中快速开始
第一步:数据库定义
使用 SmartEDB Python API 的第一步是定义您希望在 SmartEDB 数据库中管理的类。SmartEDB Python 包装器已将 mcocomp 运行时编译在内,因此数据库模式可以像常规的 .mco 文件一样以文本形式定义。例如,以下是一个用 Python 字符串定义的简单数据库模式:
>>> schema = '''
#define uint4 unsigned<4>
declare database opendb;
class myclass {
uint4 i4;
};
'''
>>>
要处理并加载此模式,请调用 load_dictionary() 方法:
>>> dict = exdb.load_dictionary(schema)
>>> dict
<eXDB.Dictionary object at 0x1006e0790>
>>>
load_dictionary()
方法的完整签名相当复杂,因为它包含了 mcocomp
架构编译器的所有选项:
def load_dictionary(schema, nosort=False, dumpxml=False, genhpp=False,
gencs=False, genjava=False, outDir='.', csNamespace='SmartEDB',
javaPackage='SmartEDB', cmode1=False, genXmlMethods=False, genSql=False,
largeDatabase=False, wcharSize=2, use_prefix=False, include_dir='.',
compact=False, persistent=False, transient=True, suppress_api=False,
debug=False):
只有“schema”参数本身是必需的;所有其他参数都是可选的,并采用上述默认值。有关定义数据库模式的详细信息,请参阅 C API DDL 页面。
第二步:打开数据库
在 Python 中打开数据库最简单的方法是使用 open_database() 方法:
>>> db = exdb.open_database("myopendb", dict)
>>> db
<exdb.Database object at 0x100827610>
>>>
在此示例中,创建了一个名为“myopendb”的数据库。默认情况下,它以内存数据库的形式打开,使用 128MB 的内存。变量 db 是打开数据库的句柄。
若要使用其他参数创建数据库,可以指定其他参数:
def open_database(dbname, dictionary, is_disk = False,
db_segment_size = 128*1024*1024,
cache_segment_size = 16*1024*1024,
mem_page_size=256,
disk_page_size=4096,
db_log_type="REDO_LOG",
disk_max_database_size = 0,
file_extension_quantum = 4096*1024,
db_max_connections = 10)
请注意,如果参数 is_disk = True,则数据库将在持久介质上创建或打开,并且必须将相应的参数 disk_max_database_size 和 disk_page_size 设置为适当的非零值。如果 is_disk = True 且 disk_page_size = 0,则 SmartEDB 运行时将为其分配默认值 4096。如果多个应用程序或任务尝试为同一个数据库分配不同的磁盘页面大小,运行时将返回错误代码。
要将现有的磁盘文件作为数据库打开,该数据库的元数据必须与创建数据库时使用的元数据完全相同。例如,如果磁盘文件是使用 xSQL 创建的,则必须使用与 xSQL 配置文件中定义的完全相同的 max_indexes、max_classes、mem_page_size 和 disk_page_size 值。
>>> db = exdb.open_database(dbname=sys.argv[1], dictionary=dict,
is_disk=true, max_indexes=1000,
max_classes=100, mem_page_size=256,
disk_page_size=8*256)
SDK 示例 samples/python/open 展示了如何打开一个简单的内存数据库。该示例还演示了如何通过调用 Database 方法 GetRunTimeInfo() 来显示运行时信息。请构建并运行示例应用程序,并查看源代码。
第三步:数据访问操作
要对数据库对象执行操作,Python 应用程序必须首先与数据库建立连接。在调用 exdb.open_database() 方法之后,应用程序调用 Database 类的 connect() 方法来创建一个数据库连接句柄:
>>> con = db.connect()
>>>
变量 con 是连接句柄。完成后,必须关闭数据库连接:
>>> con.close()
插入数据库对象
在 SmartEDB 中,通过其任何 API(包括 Python)进行的所有数据库访问都必须在事务范围内。要在连接上启动事务:
>>>con.startTransaction()
>>>
要创建一个对象(即向数据库中插入一条记录),请使用 Connection 方法 new()
,该方法将类名作为参数。它会返回一个 Python 对象,该对象与在数据库中创建的对象相对应。当创建数据库时,Python 对象的类型会根据模式动态定义。例如:
>>> o = con.new(“myclass”)
>>>
变量“o”是一个 Python 对象,其类型为“myclass”(如模式中所定义)。现在我们可以通过输入变量名来查看其字段:
>>> o
<SmartEDB object:myclass>.{'i4':0L}
我们可以为字段赋值,例如:
>>> o.i4=10
>>> o
<SmartEDB object:myclass>.{'i4':10}
最后,提交事务以完成操作:
>>> con.commit()
>>>
检索和更新数据库对象
游标用于检索数据库对象。然后,可以使用游标的 find() 方法通过唯一索引定位对象。以下代码片段执行简单的索引搜索,通过唯一键 id 定位 Record 对象;然后更新字符串字段 str 并提交事务:
con.startTransaction(exdb.Transaction.MCO_READ_WRITE)
cursor = con.cursor()
rec = cursor.find("Record", "by_i4", 2)
rec.str = "Updated string"
cursor.close() #release cursor
con.commit() # commit changes
游标还用于检索和滚动浏览满足索引搜索条件的一组数据库对象。以下代码片段使用游标的 search() 方法检索字段 i4 的值大于或等于 2 的所有 Record 对象;然后滚动浏览结果集:
con.startTransaction(exdb.Transaction.MCO_READ_ONLY)
cursor = con.cursor()
ret = cursor.search("Record", "by_i4", exdb.Operation.GreaterOrEquals, 2)
if ret:
for rec in cursor:
print "Object found: i4=%s,str=%s" % (rec.i4, rec.str)
else::
print "Object not found"
cursor.close()
con.commit()
SDK 示例 samples/python/operations 展示了如何使用 Connection 和 Cursor 类执行基本的数据库 CRUD 操作。请构建并运行示例应用程序,并查看源代码。