如何修改 ServiceStack.OrmLite 生成的 SQL?

Posted

技术标签:

【中文标题】如何修改 ServiceStack.OrmLite 生成的 SQL?【英文标题】:How can I modify the SQL generated by ServiceStack.OrmLite? 【发布时间】:2013-06-04 11:08:45 【问题描述】:

我想在C#中使用ServiceStack'sOrmLite查询AWS RedShift。 AWS RedShift 使用 postgresql 有线协议作为其查询接口,并对可以运行的查询施加了一些限制,其中之一是它不能接受参数化查询(我被告知;我实际上还没有找到这个backed up in documentation yet)。

所以,我正在研究是否可以使用 ORM 生成参数化 SQL,然后在参数值中查找/替换。

如何访问 OrmLite 生成的 SQL,然后在运行之前对其进行更改?

【问题讨论】:

【参考方案1】:

来自OrmLite's documentation:

默认情况下 OrmLite 使用参数化 SQL。只有对所有 SQL 操作使用参数化语句的 API,这些都用 Param 后缀标识,例如:

参数化写操作

db.InsertParam(new Person  FirstName = "Jimi", LastName = "Hendrix", Age = 27)
db.UpdateParam(new Person  FirstName = "Jimi", LastName = "Hendrix", Age = 27)
db.DeleteByIdParam<Person>(1)
Parameterized Read operations

var people = db.SelectParam<Person>(q => q.Age == 27)
var person = db.GetByIdParam<Person>(1)

//Existing parameterized query API's
var people = db.Where<Person>(new  FirstName = "Jimi", Age = 27 )
var people = db.Query<Track>("FirstName = @name and Age = @age", 
    new  name = "Jimi", age = 27 )

此外,包含 QueryWhere 字样的选择方法也使用参数化 SQL(其他选择方法不)。传递到 Where 的匿名类型被视为 AND 过滤器。

var track3 = db.Where<Track>(new  AlbumName = "Throwing Copper", TrackNo = 3 )

查询语句使用来自提供的匿名类型(如果有)的属性接受参数化 SQL

var track3 = db.Query<Track>(
"select * from Track Where AlbumName = @album and TrackNo = @trackNo", 
    new  album = "Throwing Copper", trackNo = 3 )

在它执行之后(不是之前),你可以得到 Last SQL 语句生成的:

db.GetLastSql()

【讨论】:

感谢您的全面回答。但是,我想在 SQL 执行之前了解它;听起来不可能? @PeterMounce 我用(not before) 表示它不可用,你可以在调试模式下使用日志提供程序捕获before - 但这可能不是你的重来。 对;这就是我的理解。不过,令人高兴的是,我已经揭穿了我之前听到的关于 RedShift 不处理参数化查询的说法,所以我现在不再需要这样做了。 @PeterMounce 你应该关闭这个问题,这样其他人就知道不要花时间回答它。我建议添加您自己的答案,包括任何参考资料,说明它不再相关的原因。【参考方案2】:

OrmLite 不会(当前)使其生成的 SQL 在执行之前可用。

我发现 RedShift 实际上确实支持参数化查询。

【讨论】:

以上是关于如何修改 ServiceStack.OrmLite 生成的 SQL?的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server 和 ServiceStack.OrmLite 中使用架构名称

如何在 ServiceStack OrmLite 中检索自动递增的 ID?

ServiceStack.OrmLite 调用存储过程

使用 ServiceStack.ORMLite 的存储库模式中的事务

ServiceStack OrmLite 连接Sqlserver数据库

在运行时在 ServiceStack.OrmLite 中获取类的表名/避免硬编码表名