标签: postgresql-11

被 Postgres 拒绝的 Dapper 列表参数

我有一个List<Guid>(也用普通数组尝试过),我想在查询中使用它。Dapper 生成 SQL 并正确替换编号参数的参数。但是,PG 抱怨 list 参数的语法。没有提供进一步的细节。复制生成的 SQL 并用实际值替换数字(将括号添加到列表参数),查询有效。

这是生成的 SQL 中的违规子句:

WHERE (
    names.tenant = $1
    AND scan_results.tenant = $1
    AND scan_results.scan IN $2
)
Run Code Online (Sandbox Code Playgroud)

Dapper 的原始语句字符串是这样的:

WHERE (
    file_names.tenant = @tenantId
    AND scan_results.tenant = @tenantId
    AND scan_results.scan IN @validScans
)
Run Code Online (Sandbox Code Playgroud)

查询是这样执行的con.Query

con.Query(stmt, new
{
    tenantId = tenant.Id,
    validScans = tenant.LatestScans // .ToArray()
});
Run Code Online (Sandbox Code Playgroud)

确切的 Postgres 错误是:

ERROR:  syntax error at or near "$2" at character ...
Run Code Online (Sandbox Code Playgroud)

c# postgresql dapper postgresql-11

2
推荐指数
1
解决办法
857
查看次数

我可以使用 postgres JDBC 驱动程序从 java 调用 postgres“程序”(不是“函数”)吗?

我是 postgres 的新手,但我试图在 Postgres 11 中调用一个过程(新的“过程”而不是“函数”),从 java 作为 spring SimpleJDBCCall 调用(使用 Postgresql-42.2.5 jdbc 驱动程序)。但是,当我执行该过程时,遇到以下异常:

org.springframework.jdbc.BadSqlGrammarException: CallableStatementCallback; 错误的 SQL 语法 [{call pa_test_schema.pr_dosomething(?)}]; 嵌套异常是 org.postgresql.util.PSQLException:错误:pa_test_schema.pr_dosomething(bigint) 是一个过程提示:要调用一个过程,请使用 CALL。位置:15 在 org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:101) 在 org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) 在 org.springframework.jdbc AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) 在 org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:

我的程序代码:

CREATE PROCEDURE pa_test_schema.pr_DoSomething
( P_input_ID IN inputs.input_ID%TYPE
) AS $$
BEGIN
    -- do something   
END; 
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

我的Java代码:

SimpleJdbcCallOperations pr_DoSomething =  new SimpleJdbcCall(jdbcTemplate)
        .withSchemaName("pa_test_schema")
        .withProcedureName("pr_DoSomething");
Map<String, Object> inputs = Maps.newHashMap();
inputs.put("p_input_id", 123456);

pr_DoSomething.execute(inputs);    
Run Code Online (Sandbox Code Playgroud)

当我逐步执行代码时,我可以看到驱动程序正在将可调用语句的 sql 修改为调用 postgres 函数所需的语法:

select * from pa_test_schema.pr_dosomething(?) 作为结果

这是执行此转换的驱动程序中的方法: …

stored-procedures jdbc spring-jdbc postgresql-11

2
推荐指数
1
解决办法
5183
查看次数

命令“ python setup.py egg_info”在PATH / psycopg2中失败,错误代码为1

我需要将PostgreSQL从9.5版升级到11版。之后,当我从“ requirements.txt”文件重新创建virtualEnv时,在安装psycopg2软件包时开始出现以下错误:

Collecting psycopg2 == 2.6.2 (from -r conf/requirements.txt (line 50))
  Using cached https://files.pythonhosted.org/packages/7b/a8/dc2d50a6f37c157459cd18bab381c8e6134b9381b50fbe969997b2ae7dbc/psycopg2-2.6.2.tar.gz
    Complete output from command python setup.py egg_info:
    running egg_info
    creating pip-egg-info/psycopg2.egg-info
    writing pip-egg-info/psycopg2.egg-info/PKG-INFO
    writing top-level names to pip-egg-info/psycopg2.egg-info/top_level.txt
    writing dependency_links to pip-egg-info/psycopg2.egg-info/dependency_links.txt
    writing manifest file 'pip-egg-info/psycopg2.egg-info/SOURCES.txt'
    Error: could not determine PostgreSQL version from '11 .1 '
    
    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-install-0Q7bhV/psycopg2/
Run Code Online (Sandbox Code Playgroud)

pip psycopg2 virtualenv python-2.7 postgresql-11

2
推荐指数
1
解决办法
2710
查看次数

postgres 中的索引元组最大大小是多少?

我引用https://www.postgresql.org/docs/11/sql-createindex.html关于INCLUDE条款:

在将非键列添加到索引时保守一点是明智的,尤其是宽列。如果索引元组超过索引类型允许的最大大小,数据插入将失败。在任何情况下,非键列都会从索引的表中复制数据并使索引的大小膨胀,从而可能减慢搜索速度。

我想知道这index tuple max size对于可能插入失败的 btree 索引是什么。

用例:我正在考虑INCLUDE将 json 列(<1000 个字符)添加到唯一索引。

postgresql postgresql-11

2
推荐指数
1
解决办法
706
查看次数

创建序列时AS整数附近的语法错误

当我尝试使用psql执行时,以下代码中出现“ AS整数或附近的错误”。

CREATE SEQUENCE public.auth_group_id_seq
    AS integer
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
Run Code Online (Sandbox Code Playgroud)

上面的sql语句来自本地计算机postgres版本11的备份文件,并在EC2 postgres版本9.3中执行。我是postgres的新手,并且不知道,因为sql仅由postgres生成,因此它应该与psql一起使用。提前致谢。

postgresql postgresql-9.3 postgresql-11

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

Postgres 中字段 TIMESTAMP NOT TIME ZONE DEFAULT CURRENT_TIMESTAMP 的 JPA 模型类?

我在 Postgres 的下表中使用了Java 8 和 Postgres-11以及 Spring Boot 2.1.6.RELEASE。我已经解决了这个问题这个问题,但我真的想使用 Java 8 Date API 而不是 Java 7。

CREATE TABLE note(
    note_id serial PRIMARY KEY,
    message varchar(255) NOT NULL,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
Run Code Online (Sandbox Code Playgroud)

我创建了如下所示的模型类,但与我需要的不匹配。

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Entity
public class Note extends AuditEnabledEntity{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "note_id")
    private int noteId;
    
    @Column(name = "message")
    private String message;
    
    @Column(name = "created_at")
    private LocalDateTime createdAt;
}
Run Code Online (Sandbox Code Playgroud)

java postgresql spring-boot jpa-2.2 postgresql-11

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

在 postgres 的事务中运行代码块

我想在事务中运行以下代码块,以便如果任何一个失败,sql statements整个事务都会中止。如果我按原样运行以下块,它是在事务中运行还是需要在内部运行BEGIN; ... COMMIT;

DO $$
  DECLARE
    readonly_exists int;
BEGIN
  SELECT COUNT(*) INTO readonly_exists FROM information_schema.enabled_roles
    WHERE role_name = 'readonly';
  IF readonly_exists = 0 THEN
    <SQL STATEMENT 1>
    <SQL STATEMENT 2>
    <SQL STATEMENT 3>
  ELSE
    RAISE EXCEPTION 'readonly role already exists';
  END IF;
END$$;
Run Code Online (Sandbox Code Playgroud)

postgresql postgresql-11

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

Postgresql 11:存储过程调用错误 - 要调用过程,请使用 CALL、Java

我将 PGsql 函数转换为程序 (v11) 以进行交易。但是在从 Java 代码调用该过程时,Java 代码抛出以下异常:

2021-01-10 21:52:56,604 WARN  [ForkJoinPool.commonPool-worker-1] o.h.e.j.spi.SqlExceptionHelper(144) - SQL Error: 0, SQLState: 42809
2021-01-10 21:52:56,605 ERROR [ForkJoinPool.commonPool-worker-1] o.h.e.j.spi.SqlExceptionHelper(146) - ERROR: some_procedure_name(character varying, character varying) is a procedure
  Hint: To call a procedure, use CALL.
  Position: 15
Run Code Online (Sandbox Code Playgroud)

我正在使用 Spring Data JPA's @Procedure(name = "some_procedure_name"),并且这个过程被声明为@NamedStoredProcedure实体类。问题是,这个注解仍然像 PG 版本 11 之前那样将其作为 Function 方式调用。

任何帮助。

java postgresql stored-procedures spring-data-jpa postgresql-11

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

使用存储过程 PostgreSQL 11.1 从表中检索数据

我的表格有两列colacolb.

我想使用存储过程从表中选择列。

注意:由于返回类型,我不想使用函数。

尝试:

CREATE OR REPLACE PROCEDURE public.sptest()
LANGUAGE sql

AS $BODY$
         select cola from test;
$BODY$;
Run Code Online (Sandbox Code Playgroud)

调用程序:

call sptest()
Run Code Online (Sandbox Code Playgroud)

输出:

数据输出中没有任何内容。

消息窗口显示:

CALL

Query returned successfully in 147 msec. 
Run Code Online (Sandbox Code Playgroud)

postgresql postgresql-11

0
推荐指数
1
解决办法
1389
查看次数

从 Postgres 版本 11 到 Postgres 版本 12 有什么重大变化吗?

我们想要将 postgres 升级到版本 12,想知道我们是否有任何语法更改会影响在 postgres 版本 11 上编写的查询。

我目前正在检查使用 - 但没有发现任何会改变查询的差异。

https://www.postgresql.org/about/featurematrix/

任何帮助表示赞赏。

postgresql postgresql-11 postgresql-12

-1
推荐指数
1
解决办法
3435
查看次数

PostgreSQL 插入后触发写入另一个表

我正在尝试为 pgsql 编写一个触发器来保留特定表上的插入、更新和删除的日志。

我在创建触发器时在位置 171 上收到错误,但我真的不知道为什么。

日志表

+----------+-----------+---------------------------+
|table_name|column_name|data_type                  |
+----------+-----------+---------------------------+
|logs      |id         |bigint                     |
|logs      |action     |smallint                   |
|logs      |table      |character varying          |
|logs      |primary    |bigint                     |
|logs      |log        |json                       |
|logs      |processed  |boolean                    |
|logs      |created_at |timestamp without time zone|
|logs      |updated_at |timestamp without time zone|
+----------+-----------+---------------------------+
Run Code Online (Sandbox Code Playgroud)

功能和触发

CREATE OR REPLACE FUNCTION insert_log (INT, VARCHAR, INT, VARCHAR) RETURNS INT AS $$
    BEGIN
        INSERT INTO public.logs ("action", "table", "primary", "log")
            VALUES ($1, $2, $3, $4)
            RETURNING id;
    END
$$ …
Run Code Online (Sandbox Code Playgroud)

sql postgresql triggers sql-insert postgresql-11

-1
推荐指数
1
解决办法
3504
查看次数