mormot 1.18 第23章 使用纯sql
有时你可能不想使用orm,或者由于现有且不可更改的数据库与orm不兼容而无法使用它。在这些情况下,你仍然可以依靠mormot的其他功能,同时使用纯sql。
你可以发出纯sql命令并以json格式获取数据。下面的示例展示了如何使用快速且开源的zeos数据库库与mariadb/mysql一起执行此操作。
请注意,如何在同一台机器上的多个数据库中对表进行联接是可能的。
program listpeople;
{$apptype console}
uses
windows, messages, sysutils, variants, classes,
syncommons, mormot, mormotsqlite3, mormotdb,
syndb, syndbsqlite3, syndbdataset, syndbzeos,
synsqlite3, synsqlite3static, dateutils;
procedure list(const arawservername, adatabasename, auserid, apassword: rawutf8);
var
propsclass: tsqldbconnectionpropertiesclass;
aservername: rawutf8;
u, s: rawutf8;
props: tsqldbconnectionproperties;
i: integer;
begin
propsclass := tsqldbzeosconnectionproperties;
aservername := tsqldbzeosconnectionproperties.uri(dmysql, arawservername);
props := propsclass.create(aservername, adatabasename, auserid, apassword);
try
s := 'u.surname,u.givennames,u.departments, u.offices,u.phones,u.email, ' +
'u.homepage, p.employeeid, h.title ';
u := props.execute('select ' + s + ' from ' +
'import.users u left join ' +
'local.person p on p.email = u.email ' +
'left join local.hr h on p.nexus = h.userid ' +
' where surname like ?',['engelke%']).fetchallasjson(true);
writeln(u);
finally
props.free;
end;
end;
begin
try
list('blah.erickengelke.com:3306', 'customers', 'userx', 'changeme23');
except
on e: exception do
writeln('error: ' + e.message);
end;
end.
你可以使用props.execute(sql).fetchallasjson来执行返回值的命令,或者使用props.executenoreturn(sql)当没有预期结果时,例如:
props.executenoreturn('delete * from users where email like ?',['erick%']);
注意:在提供的代码示例中,存在一些小错误和不一致之处,比如local.person和local.hr可能不是有效的表名,它们仅用于示例目的。在实际应用中,需要替换为真实的数据库表名。此外,select语句中的字符串连接和字段列表也需要根据实际的数据库结构调整。代码中的?占位符用于参数化查询,以防止sql注入攻击,并且在实际执行时需要提供相应的参数值。
另外,请注意executenoreturn用于执行不返回结果的sql语句,如delete、update或insert等。而execute方法则用于执行返回结果的查询,并通过fetchallasjson方法将结果转换为json格式。在实际应用中,确保正确处理异常和错误情况,以保证代码的健壮性和稳定性。
发表评论