PostgreSQL:以非编程方式(使用工具)选择大型对象(如文本)
我们正在使用带有JPA的PostgreSQL,它将大字符串映射到类型为PostgreSQL:以非编程方式(使用工具)选择大型对象(如文本),postgresql,jdbc,Postgresql,Jdbc,我们正在使用带有JPA的PostgreSQL,它将大字符串映射到类型为TEXT的列 虽然我们可以通过编程读取和写入数据,但当我选择数据时,pgAdmin和psql只显示对象ID 是否有一种方法/工具可以在不使用某些API(例如JDBC)的情况下快速选择数据 例如: doi=> \d+ xmlsnippet; Table "doi.xmlsnippet" Column | Type | M
TEXT
的列
虽然我们可以通过编程读取和写入数据,但当我选择数据时,pgAdmin和psql只显示对象ID
是否有一种方法/工具可以在不使用某些API(例如JDBC)的情况下快速选择数据
例如:
doi=> \d+ xmlsnippet;
Table "doi.xmlsnippet"
Column | Type | Modifiers | Storage | Description
--------------+------------------------+-----------+----------+-------------
dbid | bigint | not null | plain |
version | bigint | not null | plain |
datasnippet | text | | extended |
doi | character varying(255) | | extended |
doipool_dbid | bigint | | plain |
列datasnippet
包含一些大字符串(带有XML代码)
当我选择它时,我得到
doi=> select * from xmlsnippet;
dbid | version | datasnippet | doi | doipool_dbid
-------+---------+-------------+--------------------------+--------------
43 | 0 | 282878 | 10.3929/ethz-a-000077127 | 13
44 | 0 | 282879 | 10.3929/ethz-a-000085677 | 13
45 | 0 | 282880 | 10.3929/ethz-a-000085786 | 13
46 | 0 | 282881 | 10.3929/ethz-a-000087642 | 13
47 | 0 | 282882 | 10.3929/ethz-a-000088898 | 13
^^^^^^^
编辑:如果我使用JDBC执行相同的查询,我会得到预期的内容(我存储在列中的文本)可能是一个“常见疑点”(即JPA/Hibernate/PostgreSQL JDBC驱动程序)将列映射到PostgreSQL的“大对象”系统中
psql
shell中的快速测试:
db=> \lo_export 282878 /tmp/x.txt
lo_export
将示例中第一个id引用的内容导出到文件/tmp/x.txt
。用编辑器检查它。告诉我们这是不是你的数据
如果这种映射真的发生了,那么您就有一个维护问题——大型对象必须手动删除,并且还有一些其他固有的缺点。但这是另一个故事。在pgAdmin III中,我使用:
select dType, id, loread(lo_open(docxml::::int, 131072), 999999999) from XmlPadraoNFe
请参阅:文本类型的列应该包含文本本身,而不是对内容的引用。在上面显示的select*中,很明显,datasnippet列被误用来存储对真实文本的引用,而真实文本可能存储在其他地方,可能存储在不同的表中。如果这个理论是正确的,你找到了那张表,您可以将它连接到xmlsnippet并创建一个视图,该视图将输出xmlsnippet.*以及您感兴趣的文本。@DanielVérité问题是没有其他表,如果我从xmlsnippet中选择datasnippet,例如使用JDBC,我将在没有任何显式连接的情况下获取数据并写入数据。@Matteo:您要么没有向我们显示正确的表定义,要么正在从JDBC应用程序连接到不同的数据库。文本列不是“大对象”,也不包含“对象id”,除非您自己将其存储在其中。有没有可能JPA在那里发挥了某种“魔力”?好的,我得到了数据。然后我将尝试更改映射。我只是被表定义没有显示任何内容的事实弄糊涂了。事实上,很难看出282878是
TEXT
列的内容还是大型对象的ID。这是这里发生的奇怪事情之一。我还希望至少有一个数字列类型(oid
,integer
,…),而不是text
。是的,我也这么想,因此我的问题是:-)