2017-05-09 28 views
2

我正在使用NHibernate从我的数据库中创建条目时,从一个使用.NET库的API中提取数据以允许与它交互。我目前使用Greenplum,不幸的是它不支持RETURNING子句(添加到由NHibernate生成的查询的末尾)。阻止NHibernate添加返回子句到生成的插入语句

我想知道是否可以抑制在INSERT语句结尾添加“返回ID”?就好像我是做在Python类似与SQLAlchemy的(与我比较熟悉)的东西,我可以做到以下几点,以防止被添加RETURNING子句:

engine = create_engine(conn_str, implicit_returning=False) 

希望我能提供足够的信息,任何帮助将非常感谢。

亲切的问候,

亚当风格

+0

Greenplum的不适合单插入语句这样的表现将是,即使你解决这个穷得问题,如果你试图插入很多行。你会想要使用gpload来加载数据。 –

回答

0

您需要使用您的数据库兼容的SQL dialect。参考文件可能不完整,请检查sources以检查所有现有的方言。 目前没有专门的方言。

因为它来自,所以您可以尝试使用PostgreSQL方言。这已经可能是你正在做的事情,但是你需要使用一个不支持返回插入的方法(Dialect.SupportsInsertSelectIdentity)。 PostgreSQLDialect不声称支持它,但PostgreSQL81Dialect和更高版本做。所以试试PostgreSQLDialect

您可以改为使用最接近的现有方言编写并使用Greenplum的方言,然后重写需要更改的内容。 (你可以,如果你希望它contribute NHibernate的。)

注:

  1. 这件麻烦事出现在使用IDS生成在插入DB-侧,比如身份。使用其他发电机策略也可以避免麻烦,同时具有不会触发ISession.Save上的即时insert的额外好处,从而实现批处理,更好的工作单元语义...
  2. 使用事务!否则,当Dialect.SupportsInsertSelectIdentity被禁用时,错误可能会导致应用程序无法检索插入的ID。 (看多种形式:NH-926NH-2145NH-3600或者,您可以connection.release_mode配置属性设置为on_close。)