如果存在则如何映射列,否则为空

时间:2019-06-22 16:41:31

标签: nhibernate

我正在尝试将属性映射到公式以选择值(如果该列是否存在,则为默认值)

我尝试了以下

AttributeError Traceback (most recent call last) <ipython-input-63-6acaac7e556d> in <module>() 97 return model 98 ---> 99 model = my_model([3, 32, 32], 10) 100 from keras.optimizers import Adam 101 24 frames /usr/local/lib/python3.6/dist-packages/keras/engine/network.py in build_map(tensor, finished_nodes, nodes_in_progress, layer, node_index, tensor_index) 1323 ValueError: if a cycle is detected. 1324 """ -> 1325 node = layer._inbound_nodes[node_index] 1326 1327 # Prevent cycles. AttributeError: 'NoneType' object has no attribute '_inbound_nodes'

我收到一个错误 SqlException:无效的列名'GroupId'。

2 个答案:

答案 0 :(得分:0)

此SQL语句将返回名称为“ Azure”的所有表

select * from INFORMATION_SCHEMA.COLUMNS SYS_COLS_TBL 
 WHERE SYS_COLS_TBL.TABLE_NAME ='Azure' 
   AND SYS_COLS_TBL.COLUMN_NAME = 'GroupId'

但是,可能有两个这样的表格..但使用不同的 方案 。如果发生这种情况,我们可以在dbo.Azure具有列SomeOtherSchema.Azure的情况下查询GroupId ..这将解决它:

select * from INFORMATION_SCHEMA.COLUMNS SYS_COLS_TBL 
 WHERE SYS_COLS_TBL.TABLE_NAME ='Azure' 
   AND SYS_COLS_TBL.COLUMN_NAME = 'GroupId'
   AND SYS_COLS_TBL.TABLE_SCHEMA = 'dbo'

此外,要支持更复杂的查询(JOIN关联),请删除 this _。

代替:

then this_.GroupId else '' end)

使用:

then GroupId else '' end)

NHibernate将根据上下文提供适当的别名

答案 1 :(得分:0)

SQL语句要求确实存在对表和列的所有引用。因此,您会收到Invalid column name 'GroupId'错误。

执行类似操作的通常方法是使用动态sql(sp_executesql @sql):

DECLARE @sql NVARCHAR(MAX) = '
SELECT '+
    (CASE WHEN EXISTS (SELECT *
                       FROM INFORMATION_SCHEMA.COLUMNS 
                       WHERE TABLE_SCHEMA = 'dbo' AND --assuming the schema is dbo
                             TABLE_NAME = 'Azure' AND
                             COLUMN_NAME = 'GroupId'
                      )
          then 'GroupId'
          else 'NULL as GroupId'
     end) + '
FROM Azure';

exec sp_executesql @sql

但是这不起作用,因为您已经在SQL语句的上下文中,并且无法在其中注入动态sql。

要解决此问题,有几种解决方法:

  1. 正确的解决方案:在数据库中创建缺少的列。

  2. 痛苦的解决方案:将对象映射到存储过程,该存储过程将执行与上述类似的动态SQL。

  3. 非常痛苦的解决方案:正常映射您可能缺少的列。在建立工厂之前-内省模型并为缺少的列删除映射或将其映射更改为公式。这与NHibernate的Configuration.ValidateSchema方法类似,但是要避免抛出错误-您需要从映射中删除这些列。