- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当使用 PostgreSQL 将数据存储在类字符串验证类型的字段中时,如 xml
、json
、jsonb
、xml
、ltree
等,INSERT
或 UPDATE
失败并出现如下错误:
column "the_col" is of type json but expression is of type character varying
...或者
column "the_col" is of type json but expression is of type text
为什么?我该怎么办?
我正在使用 JDBC (PgJDBC)。
这是通过 Hibernate、JPA 和各种其他抽象层实现的。
PostgreSQL 团队的“标准”建议是在 SQL 中使用 CAST
。这对使用查询生成器或 ORM 的人没有用,特别是如果这些系统没有明确支持数据库类型,如 json
,因此它们通过 String
映射到应用程序。
有些 ORM 允许自定义类型处理程序的实现,但我真的不想为每个 ORM 的每个数据类型编写自定义处理程序,例如Hibernate 上的 json、EclipseLink 上的 json、OpenJPA 上的 json、Hibernate 上的 xml 等等。没有用于编写通用自定义类型处理程序的 JPA2 SPI。我正在寻找通用解决方案。
最佳答案
问题是 PostgreSQL is overly strict about casts between text and non-text data types .它不允许从文本类型(如 text
或 )进行隐式转换(在 SQL 中没有
(CAST
或 ::
) varcharcharacter varying
)到类似文本的非文本类型,如 json
、xml
等
The PgJDBC driver specifies the data type of varchar
when you call setString
to assign a parameter .如果列、函数参数等的数据库类型实际上不是 varchar
或 text
,而是另一种类型,则会出现类型错误。许多其他驱动程序和 ORM 也是如此。
stringtype=unspecified
使用 PgJDBC 时的最佳选择通常是 pass the parameter stringtype=unspecified
.这会覆盖将 setString
值作为 varchar
传递的默认行为,而是让数据库“猜测”它们的数据类型。在几乎所有情况下,这都完全符合您的要求,将字符串传递给您要存储的类型的输入验证器。
CREATE CAST ... WITH FUNCTION ...
你可以改为 CREATE CAST
定义特定于数据类型的强制转换以允许逐个类型地进行此操作,但这可能会在其他地方产生副作用。如果这样做,请不要使用WITHOUT FUNCTION
转换,它们会绕过类型验证并导致错误。您必须使用数据类型的输入/验证函数。使用 CREATE CAST
适用于其他数据库驱动程序的用户,这些用户无法通过任何方式停止指定字符串/文本参数类型的驱动程序。
例如
CREATE OR REPLACE FUNCTION json_intext(text) RETURNS json AS $$
SELECT json_in($1::cstring);
$$ LANGUAGE SQL IMMUTABLE;
CREATE CAST (text AS json)
WITH FUNCTION json_intext(text) AS IMPLICIT;
如果您的 ORM 允许,您可以为数据类型和特定的 ORM 实现自定义类型处理程序。这在您使用可以很好地映射到 PostgreSQL 类型的 native Java 类型而不是使用 String
时非常有用,尽管如果您的 ORM 允许您使用注释等指定类型处理程序,它也可以工作。
实现自定义类型处理程序的方法是特定于驱动程序、语言和 ORM 的。 Here's an example for Java and Hibernate for json
.
PGObject
的类型处理程序如果您在 Java 中使用 native Java 类型,则可以扩展 PGObject
为您的类型提供 PgJDBC 类型映射。您可能还需要实现特定于 ORM 的类型处理程序才能使用您的 PGObject
,因为大多数 ORM 只会对它们无法识别的类型调用 toString
。这是在 Java 和 PostgreSQL 之间映射复杂类型的首选方式,但也是最复杂的方式。
setObject(int, Object)
的类型处理程序如果您使用 String
来保存 Java 中的值,而不是更具体的类型,您可以调用 JDBC 方法 setObject(integer, Object)
来存储未指定特定数据类型的字符串。 JDBC 驱动程序将发送字符串表示,数据库将从目标列类型或函数参数类型推断类型。
问题:
外部:
关于json - 存储 json、jsonb、hstore、xml、enum、ipaddr 等失败,显示 "column "x“是 json 类型,但表达式是字符类型变化”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32238884/
这正确地呈现了标题,因为我可以看到一个列带有“Product ID”标题的表:。我正试图重构它,这样我就可以重用它,因为它们在整个应用程序中几乎是相同的:。在这种情况下,头不会呈现...检查页面元素中
我什至不知道如何表达这一点,但在 Python 中有没有一种方法可以引用等号之前的文本,而无需实际再次编写? ** 编辑 - 我在 Jupyter 中使用 python3 我似乎用了半辈子的时间来写作
假设我有一个包含以下列的字典 dict_ = [ {'key1': 'value1', 'key2': 'value2', 'key3': 'value3', '
假设我有一个包含以下列的字典 dict_ = [ {'key1': 'value1', 'key2': 'value2', 'key3': 'value3', '
假设我的数据库中有一张地铁 map ,其中每条线路的每个站点都是一行。如果我想知道我的线路在哪里互连: mysql> SELECT LineA.stop_id FROM LineA, LineB WH
代码 select c1,c2,c3,c4,c5,c6 from table where c5 in ('a', 'b') 从这里开始,我想将 c5 列拆分为两列,然后根据它们对 c
我正在尝试搜索表格中的两列,即标题和描述。但我想先搜索标题,然后再搜索描述。所以匹配标题的所有行排在第一位,所有匹配描述的行排在第二位 我可以使用单个 SQL 查询来实现吗? 最佳答案 您还可以使用
下面有以下 Python 数据框。 “标志”字段是我想要用代码创建的所需列。 我想要执行以下操作: 如果“分配类型”是预测的并且“Activities_Counter”大于 10,我想创建一个名为“F
我有两列,area 和 block,其中 area 是一个 int 类型,block 是一个 varchar。 现在我正在写两个查询: select * from table where area a
使用 Slick 2,我试图生成一个带有元组 IN 子句的查询: select * from my_table where (a, b) IN ((1, 87)); 给定: val seq: Seq[
我正在尝试从数据透视表中获取一组值,其中 A 列等于值数组,例如 ID 12 的 attribute_value_id 等于 3 和 9。这可以做到吗?我已经走了这么远... ID | post_id
我找不到这样做的有效方法。我在 Python 中有以下 DataFrame,列从 A 到 Z A B C ... Z 0 2.0 8.0 1.0 ... 5.0 1
我的数据框中有以下格式的数据: >>> df = pd.DataFrame(np.random.randn(6,4),index=dates,columns=list('ABCD')) >>> df
我有多个与我公司销售的产品相关的表被新产品取代,随着时间的推移,这导致了多个表的出现。 我一遍又一遍地使用以下查询,直到最终表中只剩下 2 个产品... CREATE TABLE mar15a
我有如下 2 个表:- 表A ------------------------------- | product_id | price | --------------------
我有一个名为 tbl_mainsheet7 的表,创建方式如下: pk_mainsheet client_id project_id mainsheet_id project_cat EA_
我得到了以下 HTML 结构: ... ... 我的 CSS: #main-container { width:80%; margin:20px auto;
对于我的以下要求,我无法获得解决方案。 如果 data.table(如下)在 Col1 和 Col3 中有匹配的值。替换 Col2 值(旧的 New-Val)。 Col1 Col2 Col3
我正在通过连接几个表来构建一个 View ,以通过 Entity Framework 提取数据。由于此 View 没有唯一列,EntityFramework 无法检索正确的结果集(即第一列重复)。 为
好的,我已经尝试了太久了,是时候寻求帮助了。我有一个看起来有点像这样的数据框: person fruit quantity all_fruits 0 p1 grapes 2
我是一名优秀的程序员,十分优秀!