我正在尝试使用 Dapper、Npgsql 从 .net 应用程序连接到 postgres 数据库。插入后,我想知道插入行的 id。我已阅读并尝试过此处讨论的,postgresql,dapper,npgsql"/>

首页 > 解决方案 > postgres 返回 id 或选择 currval(pg_get_serial_sequence('',''))?

我正在尝试使用 Dapper、Npgsql 从 .net 应用程序连接到 postgres 数据库。插入后,我想知道插入行的 id。我已阅读并尝试过此处讨论的

问题描述

我正在尝试使用 Dapper、Npgsql 从 .net 应用程序连接到 postgres 数据库。插入后,我想知道插入行的 id。我已阅读并尝试过此处讨论的选项。我试过returning id这样使用:

id = connection.Execute("insert into document_tag (tag) values (@tag) returning id;",
            new { tag },
            transaction);

但我在 id 中只得到“1”。

我也尝试currval像这样使用:

id = connection.Execute("insert into document_tag (tag) values (@tag); select currval(pg_get_serial_sequence('document_tag','id'));",
            new { tag },
            transaction);

即使在这种情况下,我在id.

在这两种情况下,插入都是成功的,并且数据库中的id列具有除“1”之外的有效序列号。

我的期望是错误的还是有替代方案?


根据来自另一个数据帧的查找值创建一个 pandas 列

我有一个 pandas 数据框,它按小时有一些数据值(这也是index这个查找数据框的)。数据框如下所示:

In [1] print (df_lookup) 
Out[1] 0     1.109248
       1     1.102435
       2     1.085014
       3     1.073487
       4     1.079385
       5     1.088759
       6     1.044708
       7     0.902482
       8     0.852348
       9     0.995912
       10    1.031643
       11    1.023458
       12    1.006961
       ...
       23    0.889541

我想将此查找数据帧中的值相乘以创建另一个数据帧的列,该数据帧以日期时间为索引。数据框如下所示:

In [2] print (df)
Out[2] 
Date_Label           ID  data-1  data-2    data-3
2015-08-09 00:00:00  1   2513.0    2502     NaN  
2015-08-09 00:00:00  1   2113.0    2102     NaN  
2015-08-09 01:00:00  2   2006.0    1988     NaN  
2015-08-09 02:00:00  3   2016.0    2003     NaN 
...
2018-07-19 23:00:00  33  3216.0    333      NaN  

我想data-3从列计算data-2列,其中赋予“data-2”列的权重取决于 df_lookup 中的相应值。我通过如下循环索引来获得所需的值,但这太慢了:

for idx in df.index:
   df.loc[idx,'data-3'] = df.loc[idx, 'data-2']*df_lookup.at[idx.hour]

有人可以建议更快的方法吗?

标签: postgresqldappernpgsql

解决方案


要插入一行并取回数据库生成的列,请使用:

INSERT INTO document_tag (tag) VALUES (@tag) RETURNING id

请注意,“RETURNING”之前没有分号 - 它只是 INSERT 语句的一个子句,正如您在 PostgreSQL 文档中看到的那样

此外,一旦添加了 RETURNING 子句,INSERT 语句就会返回一个包含所请求信息的结果集,就像执行 SELECT 语句一样。Dapper 的Execute()目的是在没有结果集的情况下执行,因此您需要切换到Query(),并且可能添加一个Single()方法来提取您需要的单个值。另一种选择是ExecuteScalar().


推荐阅读