标签: postgresql-11

Postgres提交的过程中可以存在异常块吗?

我在理解Postgres中的交易时遇到了困难。我的程序可能会遇到异常。在过程的某些部分中,我可能想要到目前为止进行工作,这样在发生异常时不会回滚它。

我想在过程的末尾有一个异常处理块,在该块中捕获异常并将异常信息插入到日志表中。

我将问题简化为下面的简单过程,该过程在PostgreSQL 11.2上失败,

2D000 cannot commit while a subtransaction is active
PL/pgSQL function x_transaction_try() line 6 at COMMIT
Run Code Online (Sandbox Code Playgroud)
2D000 cannot commit while a subtransaction is active
PL/pgSQL function x_transaction_try() line 6 at COMMIT
Run Code Online (Sandbox Code Playgroud)

为什么此存储过程不起作用?为什么为什么我们从来没有看到过输出,raise notice 'B'而是进入了异常块?是否可以使用Postgres 11存储过程来完成上述操作?

编辑:这是一个完整的代码示例。将以上完整的代码示例(包括create procedurecall语句)粘贴到sql文件中,然后在Postgres 11.2数据库中运行以进行复制。所需的输出将是该函数A随后打印的结果B,但A随后会C与异常信息一起打印。

还要注意,如果注释掉所有异常处理块,以使该函数根本不捕获异常,则该函数将输出“ A”然后输出“ B”而不会发生异常。这就是为什么我将问题命名为“具​​有异常块的过程中Postgres提交可以存在吗?”的原因。

postgresql stored-procedures plpgsql postgresql-11

7
推荐指数
2
解决办法
1046
查看次数

PostgreSQL 11 共享内存错误:无法打开共享内存段“/PostgreSQL.XXXXXXXX”:没有这样的文件或目录

共享内存文件在 Postgres 11 中的某个时间(约 15 小时)被删除

2019-07-09 08:46:41 CDT [] [6723]: [1-1] user=,db=,e=58P01 ERROR:  could not open shared memory segment "/PostgreSQL.291691635": No such file or directory
2019-07-09 08:46:41 CDT [] [6722]: [1-1] user=,db=,e=58P01 ERROR:  could not open shared memory segment "/PostgreSQL.291691635": No such file or directory
2019-07-09 08:46:41 CDT [10.40.0.204(60550)] [13880]: [1-1] user=user_name,db=db_name,e=58P01 ERROR:  could not open shared memory segment "/PostgreSQL.291691635": No such file or directory
2019-07-09 08:46:41 CDT [10.40.0.204(60550)] [13880]: [2-1] user=user_name,db=db_name,e=58P01 CONTEXT:  parallel worker
2019-07-09 08:46:41 CDT [10.40.0.204(60550)] …
Run Code Online (Sandbox Code Playgroud)

postgresql systemd ubuntu-18.04 postgresql-11

7
推荐指数
1
解决办法
1万
查看次数

Postgresql 11 - 按整数数组索引排序

我想根据数组中的 id 顺序在数据库中列出我的产品

我的阵列

'{3,2,1}'::int[]
Run Code Online (Sandbox Code Playgroud)

例如

SELECT id FROM product WHERE id = ANY ('{3,2,1}'::int[]);
Run Code Online (Sandbox Code Playgroud)

此查询获取按产品 id 排序的产品

|id|
|1 |
|2 |
|3 |
Run Code Online (Sandbox Code Playgroud)

但我想列出按数组 id 的索引排序的产品。像这样 :

|id|
|3 |
|2 |
|1 |
Run Code Online (Sandbox Code Playgroud)

是否有可能做到这一点 ?我能怎么做 ?

sql arrays postgresql sql-order-by postgresql-11

7
推荐指数
2
解决办法
2593
查看次数

如何从 PostgreSQL 存储过程返回结果集?

PostgreSQL从版本 11 开始支持存储过程(不是函数)。我创建了一个这样的存储过程:

CREATE OR REPLACE PROCEDURE get_user_list ()
  LANGUAGE SQL
  SECURITY DEFINER
  AS $$
  SELECT "id",
         "username",
         "display_name"
  FROM "user"
  ORDER BY "created_at" ASC;
$$;
Run Code Online (Sandbox Code Playgroud)

但是当我尝试执行这个存储过程时,它不返回任何数据:

postgres=# CALL get_user_list();
CALL
postgres=# SELECT * FROM get_user_list();
ERROR:  get_user_list() is a procedure
LINE 1: SELECT * FROM get_user_list();
                      ^
HINT:  To call a procedure, use CALL.
Run Code Online (Sandbox Code Playgroud)

所以问题是,存储过程如何在 PostgreSQL 11+ 中返回其结果集?

postgresql postgresql-11

6
推荐指数
1
解决办法
1万
查看次数

无法在 Windows 10 上更改 psql 中的目录。PostgreSQL 11

我在 Windows 10 上下载了本地 PosgreSQL 11。

我尝试将命令行窗口上的 psql 中的目录更改为 c:\Program Files\PostgreSQL\11\bin>

我收到无效命令或目录不存在

我尝试跟随

postgres=# cd c:\Program Files\PostgreSQL\11\bin
Invalid command \Program. Try \? for help.
postgres-# \cd c:\Program Files\PostgreSQL\11\bin
Invalid command \Program. Try \? for help.
postgres-# \cd..
Invalid command \cd... Try \? for help.
postgres-# \cd ..
postgres-# \cd Program Files
\cd: could not change directory to "Program": No such file or directory
Run Code Online (Sandbox Code Playgroud)

我什至不确定当前目录,因为无法识别 pwd:

postgres-# \! pwd
'pwd' is not recognized as an internal or external command,
operable program …
Run Code Online (Sandbox Code Playgroud)

windows psql postgresql-11

6
推荐指数
1
解决办法
9094
查看次数

Laravel 5.5为什么删除方法中的外键违反没有引发异常?

更新3:9个月前的问题在Laragon环境中的Windows 10上的Laravel 5.8和Postgresql 11以及在Ubuntu计算机上的Apache 2.4仍然存在。雄辩模型实例delete()方法是否只是忽略外键约束?令人困惑:

我在Postgresql 9.3数据库中有两个表,公司和站点。他们与一侧的公司之间存在一对多的关系。如果已将网站分配给公司,则有一个外键约束可以防止删除公司。如果我尝试直接在数据库上使用SQL查询删除ID为“ KSL”的公司,则会收到预期的错误:

错误:对表“ companies”的更新或删除违反了表“ sites”上的外键约束“ sites_company_id_fkey”详细信息:仍从表“ sites”中引用键(company_id)=(KSL)。

我定义了一个artisan命令,其处理程序方法具有一个简单的try / catch块:

public function handle()
{
    $company = Company::find('KSL');
    try{
        $company->delete();
    }catch(\PDOException $e){
        $this->info($e->getMessage());        
    }
}
Run Code Online (Sandbox Code Playgroud)

当我从控制台运行命令时,我得到了预期的错误消息:

SQLSTATE [23503]:外键冲突:7错误:表“ companies”上的更新或删除违反了表“ sites”上的外键约束“ sites_company_id_fkey”详细信息:仍从表“ sites”中引用键(company_id)=(KSL) 。(SQL:从“ companies”中删除,其中“ company_id” = KSL)

反映由Postgresql生成的本机错误消息。但是,当我使用类似的try / catch块使用Ajax调用从Controller调用Controller的delete方法时,未捕获到异常,并且调用失败,并且没有错误的详细信息。我简化了控制器方法,使其与控制台处理程序相同:

    public function deleteModel(Request $request) {
        try {
            $id = 'KSL';
            $company = Company::find($id);
            $result = $company->delete();
            return 'success';
        } catch (\PDOException $e) {
            return $e->getMessage();
        }
     }
Run Code Online (Sandbox Code Playgroud)

通常,我将从请求参数中获取$ id的值。如果在浏览器中使用带有RESTful URL的get请求,则在Firefox中会收到“连接已重置”消息,而在Chrome中会收到类似的消息。我已经提到了我的一个老问题,我认为它可以解决问题,但是跑步composer dump-autoload没有任何效果。我已经清除了缓存,重新安装了Laravel …

postgresql-9.3 apache2.4 laravel-5 php-7.0 postgresql-11

6
推荐指数
0
解决办法
427
查看次数

如何获得postgres中两个向量之间的余弦距离?

我想知道是否有一种方法可以获取postgres中两个向量的余弦距离。为了存储向量,我使用了CUBE数据类型。

下面是我的表定义:

test=# \d vectors                                                                                                                                
                            Table "public.vectors"
 Column |  Type   | Collation | Nullable |               Default               
--------+---------+-----------+----------+-------------------------------------
 id     | integer |           | not null | nextval('vectors_id_seq'::regclass)
 vector | cube    |           |          | 
Run Code Online (Sandbox Code Playgroud)

另外,下面给出了示例数据:

test=# select * from vectors order by id desc limit 2;
   id    |                  vector                  
---------+------------------------------------------
 2000000 | (109, 568, 787, 938, 948, 126, 271, 499)
 1999999 | (139, 365, 222, 653, 313, 103, 215, 796)

Run Code Online (Sandbox Code Playgroud)

我实际上可以为此编写自己的PLPGSql函数,但想避免这种情况,因为它可能效率不高。

postgresql vector euclidean-distance cosine-similarity postgresql-11

6
推荐指数
2
解决办法
460
查看次数

如何从 PostgreSQL 存储过程中获取结果集?

我在 PostgreSQL 11 中创建了一个存储过程来执行 CRUD 操作,它适用于 1. 创建 2. 更新 3. 删除,但是当我通过传递Condition = 4选择结果集来运行读取命令时,出现以下错误。

我已经使用 PostgreSQL 函数来获取对我有用的结果集,但是我需要使用 PostgreSQL 存储过程来获取结果。

这是我的存储过程代码:

CREATE OR REPLACE PROCEDURE public.testSpCrud(
    fnam text,
    lnam text,
    id integer,
    condition integer)
LANGUAGE 'plpgsql'

AS $BODY$
declare
    countOfDisc int; 
BEGIN
if condition=1 then

INSERT INTO public.employee(
    employeeid, lname, fname, securitylevel, employeepassword, hphonearea, hphone, cphonearea, cphone, street, city, state, zipcode, extzip, name, email, groomerid, type, commission, inactive, carrierid, notoallemployees, languageid, isdogwalker, ispetsitter, ismobilegroomer, ssma_timestamp)
    VALUES (4,  'Test', 'Test', …
Run Code Online (Sandbox Code Playgroud)

postgresql stored-procedures function postgresql-11

6
推荐指数
2
解决办法
9899
查看次数

postgresql 11 - 使用 ICU 语言环境创建数据库

我想使用 ICU 系统不敏感的排序规则,以避免 postgres11-on-mac 与 postgres11-on-Ubuntu 之间的排序差异。我的第一个测试是转储现有的Collate=en_US.UTF-8并将它们 pg_restore 到使用创建的数据库中Collate=en-US-x-icu

创建数据库文档有这样的内容:

要创建具有不同语言环境的数据库音乐:

创建数据库音乐 LC_COLLATE 'sv_SE.utf8' LC_CTYPE 'sv_SE.utf8' 模板 template0;

我似乎已经有了所需的 icu 区域设置:

select collname, collprovider from pg_collation where collname like 'en_US%';

        collname        | collprovider
------------------------+--------------
 en_US.UTF-8            | c
 en_US                  | c
 en_US.ISO8859-15       | c
 en_US.ISO8859-1        | c
 en_US                  | c
 en_US                  | c
 en-US-x-icu            | i 
 en-US-u-va-posix-x-icu | i 
(8 rows)
Run Code Online (Sandbox Code Playgroud)

但使用任一 icu 语言环境创建数据库时都没有运气。

CREATE DATABASE test LC_COLLATE = 'en-US-x-icu' TEMPLATE template0;
ksysdb=# CREATE DATABASE test LC_COLLATE …
Run Code Online (Sandbox Code Playgroud)

postgresql locale collation icu postgresql-11

6
推荐指数
1
解决办法
4206
查看次数

恢复期间无法执行 ANALYZE

我们有一个仅插入表,由于使用嵌套循环而不是散列连接的查询计划,我们经常得到不好的结果。为了解决这个问题,我们必须手动运行 ANALYZE(真空有时不会在仅插入表上运行,长话短说,不是这里的重点)。当我尝试在副本机器上运行分析时,ERROR: cannot execute ANALYZE during recovery出现错误。所以这让我觉得我们可能不需要在副本上执行 ANALYZE。

我的问题是:在主节点上执行分析时统计信息是否传播到副本?

下面链接中的问题与此类似,但它是针对真空提出的。我们只使用 ANALYZE。 https://serverfault.com/questions/212219/postgresql-9-does-vacuuming-a-table-on-the-primary-replicate-on-the-mirror

postgresql database-replication postgresql-11

6
推荐指数
1
解决办法
1503
查看次数