文章目录
- 第三十七章 持久对象和SQL
- 简介
- SQL
- 从 `ObjectScript` 使用 `SQL`
- 从 `Python` 使用 `SQL`
- SQL 的对象扩展
第三十七章 持久对象和SQL
简介
IRIS 是一个与面向对象编程语言相结合的多模型数据平台。因此,可以编写灵活的代码来执行以下所有操作:
- 通过
SQL执行批量插入数据。 - 打开一个对象,对其进行修改并保存,从而无需使用
SQL即可更改一个或多个表中的数据。 - 创建并保存新对象,将行添加到一个或多个表中,而无需使用
SQL。 - 使用
SQL从记录中检索与给定条件匹配的值,而不是迭代大量对象。 - 删除对象,即在不使用
SQL的情况下从一个或多个表中删除记录。
也就是说,可以随时选择适合需要的访问模式。
在内部,所有访问都是通过直接Global访问完成的,也可以在适当的时候以这种方式访问的数据。 (如果有类定义,则不建议使用直接Global访问来更改数据。)
SQL
还可以直接在 SQL Shell(在终端中)和管理门户中执行 SQL。其中每个都包含一个用于查看查询计划的选项,它可以帮助确定提高查询效率的方法。
SQL 支持完整的入门级 SQL-92 标准,但有一些例外和一些特殊扩展。 SQL 还支持索引、触发器、BLOB 和存储过程(这些是典型的 RDBMS 功能,但不是 SQL-92 标准的一部分)。
从 ObjectScript 使用 SQL
可以使用以下一种或两种方式从 ObjectScript 执行 SQL:
动态 SQL(%SQL.Statement和%SQL.StatementResult 类),如下例所示:
SET myquery = "SELECT TOP 5 Name, DOB FROM Sample.Person"SET tStatement = ##class(%SQL.Statement).%New()SET tStatus = tStatement.%Prepare(myquery)SET rset = tStatement.%Execute()DO rset.%Display()WRITE !,"End of data"
可以在 ObjectScript 方法和例程中使用动态 SQL。
- 嵌入式SQL,如下例所示:
&sql(SELECT COUNT(*) INTO :myvar FROM Sample.Person)IF SQLCODE<0 {WRITE "SQLCODE error ",SQLCODE," ",%msg QUIT}ELSEIF SQLCODE=100 {WRITE "Query returns no results" QUIT}WRITE myvar
可以在 ObjectScript 方法和例程中使用嵌入式 SQL。
从 Python 使用 SQL
可以使用以下一种或两种方式从 Python 执行 SQL:
- 可以直接执行
SQL查询,如下例所示:
import iris
rset = iris.sql.exec("SELECT TOP 5 Name, DOB FROM Sample.Person")
for row in rset:print(row)
也可以先准备 SQL 查询,然后执行它,如下例所示:
import iris
statement = iris.sql.prepare("SELECT TOP 5 Name, DOB FROM Sample.Person")
rset = statement.execute()
for row in rset:print(row)
可以使用这两种方法之一在 Python 终端或 Python 方法中执行 SQL 查询。
SQL 的对象扩展
为了更轻松地在对象应用程序中使用 SQL,IRIS 包含了许多 SQL 对象扩展。
这些扩展中最有趣的功能之一是能够使用隐式连接运算符 (–>)(有时称为“箭头语法”)跟踪对象引用。例如,假设有一个 Vendor 类,它引用另外两个类:Contact 和 Region。可以使用隐式连接运算符引用相关类的属性:
SELECT ID,Name,ContactInfo->Name
FROM Vendor
WHERE Vendor->Region->Name = 'Antarctica'
当然,也可以使用 SQL JOIN 语法表达相同的查询。隐式连接运算符语法的优点是简洁,一目了然。