防止 NHibernate 将 Returning 子句添加到生成的插入语句中
Posted
技术标签:
【中文标题】防止 NHibernate 将 Returning 子句添加到生成的插入语句中【英文标题】:Prevent NHibernate from adding Returning clause to generated insert statements 【发布时间】:2017-05-09 07:27:58 【问题描述】:我目前正在使用 NHibernate 在我的数据库中创建条目,从使用 .NET 库的 API 提取数据以允许与之交互。我目前正在使用 Greenplum,不幸的是它不支持 RETURNING 子句(添加到 NHibernate 生成的查询的末尾)。
我想知道是否可以禁止在 INSERT 语句的末尾添加“返回 id”?就好像我在 Python 中使用 SQLAlchemy(我更熟悉)做类似的事情一样,我可以执行以下操作来防止添加 RETURNING 子句:
engine = create_engine(conn_str, implicit_returning=False)
希望我提供了足够的信息,任何帮助将不胜感激。
亲切的问候,
亚当风格
【问题讨论】:
Greenplum 不是为单例插入语句设计的,因此如果您尝试插入很多行,即使您解决了这个问题,性能也会很差。您需要使用 gpload 来加载数据。 【参考方案1】:您需要使用与您的数据库兼容的 SQL dialect。参考文档可能不完整,请查看 sources 以检查所有现有方言。 greenplum 目前似乎没有专门的方言。
由于它源自postgresql,您可以尝试使用 PostgreSQL 方言代替。这可能已经是您正在做的事情,但您需要使用一个不声称支持返回插入 (Dialect.SupportsInsertSelectIdentity
)。 PostgreSQLDialect
并没有声称支持它,但 PostgreSQL81Dialect
和以后会这样做。所以试试PostgreSQLDialect
。
您可以改为为 Greenplum 编写和使用方言,方法是从最接近的合适的现有方言派生,然后覆盖需要更改的内容。 (如果你愿意,你可以 contribute 给 NHibernate。)
注意事项:
-
当在插入时使用 ids 生成的 db-side 时会出现此问题,例如身份。使用其他生成器策略也可以避免麻烦,同时具有不会在
ISession.Save
上立即触发insert
的额外好处,从而启用批处理,更好的工作单元语义,...
使用事务!否则,当 Dialect.SupportsInsertSelectIdentity
被禁用时,一个错误可能会导致您的应用程序无法检索插入的 id。 (以多种形式出现:NH-926、NH-2145、NH-3600。或者,您可以将connection.release_mode
配置属性设置为on_close
。)
【讨论】:
以上是关于防止 NHibernate 将 Returning 子句添加到生成的插入语句中的主要内容,如果未能解决你的问题,请参考以下文章
mariadb 实用功能2 delete from table returning ... 数据恢复
NHibernate - 如何使用 where 子句保存对象