相关文章推荐
胆小的单杠  ·  将 Azure Front Door ...·  1 年前    · 
COPY table_name [ ( column_name [, ...] ) ]
    FROM { 'filename' | STDIN }
    [ [ WITH ] ( option [, ...] ) ]
COPY { table_name [ ( column_name [, ...] ) ] | ( query ) }
    TO { 'filename' | STDOUT }
    [ [ WITH ] ( option [, ...] ) ]
where option can be one of:
    FORMAT format_name
    OIDS [ boolean ]
    DELIMITER 'delimiter_character'
    NULL 'null_string'
    HEADER [ boolean ]
    QUOTE 'quote_character'
    ESCAPE 'escape_character'
    FORCE_QUOTE { ( column_name [, ...] ) | * }
    FORCE_NOT_NULL ( column_name [, ...] )
    ENCODING 'encoding_name'
FORMAT :输入/输出格式(text, csv, binary),默认的是text。

DELIMITER :输入/输出文本的分割符,文本文件默认的是tab,csv默认的逗号,此选项对二进制文件无效。另:分隔符只能为单字符。

NULL :代表空值的字符。

HEADER :是否包含第一行,只对csv文件有效。

copy导入的时候默认将整个文件的内容copy到整个表里,除此之外,可以指定导入的表的字段,导出的时候除了支持(所有字段/部分字段)导出外,还支持自定义查询语句导出。因为整个的导入导出操作是在一个事务里完成的,所以速度比insert要快。

bytea类型

bytea是二进制字符串,类似于varchar/text,但其存储单位不是字符而是字节,它可以用来存储一个字节序列,其中可以包含0字节(zero octet)以及其他一些不可打印(non-printable,值在[32, 126]范围之外的)字符。在用户看来这些就是原始的字节(raw bytes),不像varchar/tex,bytea没有什么字面意义。在postgresql中还有OID类型,用来专门操作大对象,二者的对比如下表所示:

Characteristic

BYTEA

OID

Max. allowed space

1 GB

2 GB

Data access

As a whole

Stream-style

Storage

In defined table

In pg_largeobject system table

Data manipulation

Using SQL and escaping sequnces

Only within transaction block by special functions

Loading

Preload

On demand

图片文件的存取

如图片等文件,不能直接read之后存,因为不是postgresql支持的标准二进制格式,所以不支持。如果要存的话,需要转一步:

xxd  -p /home/user/myimage.png | tr -d '\n' > /tmp/image.hex
echo "
-- CREATE TABLE hexdump (hex text);
DELETE FROM hexdump;
COPY hexdump FROM '/tmp/image.hex';
-- CREATE TABLE bindump (binarydump bytea);
DELETE FROM bindump;
INSERT INTO bindump (binarydump)  (SELECT decode(hex, 'hex') FROM hexdump limit 1);
" | psql mydatabase

其中,xxd的作用就是将一个文件以十六进制的形式显示出来。图片文件可以以二进制的形式存储,但这些二进制的字节数据不能写到文件里,需要用能识别这些字节数据的工具。比如在python中可以这样:

from PIL import Image
import psycopg2 
import StringIO
if __name__ == "__main__":    
    conn = psycopg2.connect(host="127.0.0.1", user="postgres", password="", database="postgres")
    cur = conn.cursor()    
    query_sql = "select binarydump from bindump limit 1"
    cur.execute(query_sql)    
    rcd = cur.fetchone()    
    img_data = rcd[0]    
    img = Image.open(StringIO.StringIO(img_data))    
    img.save("1.png","PNG")
在SQL语句中,可以用decode函数,将普通的字节码数据转为标准的bytea类型,在python中,可以借助psycopg2.Binary(buffer)。
import psycopg2 
if __name__ == "__main__":    
    conn = psycopg2.connect(host="127.0.0.1", user="postgres", password="", database="postgres")
    cur = conn.cursor()    
    img_buffer = None
    with open("1.png") as reader:
        img_buffer = reader.read()     
    insert_sql = "insert into bindump(binarydump) values(%s)"
    params = (psycopg2.Binary(img_buffer),)     
    cur.execute(insert_sql, params)     
    conn.commit()

再来个sql函数,如果当前表里已经有了该图片就更新,没有就插入:

CREATE OR REPLACE FUNCTION update_img(img_id character varying,img_name character varying,img_data bytea)
RETURNS void AS
$BODY$
declare
	img_exists boolean;
begin
	select exists(select 1 from my_img where imgid=img_id) into img_exists;
	if(img_exists) then
		update my_img
		set imgname = img_name,
		    imgdata = img_data
		where imgid = img_id;
		insert into my_img values(img_id, img_name, img_data);
	end if;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION update_img(character varying, character varying, bytea)
  OWNER TO postgres;

http://www.postgresql.org/docs/9.2/static/sql-copy.html

http://initd.org/psycopg/docs/module.html

http://dba.stackexchange.com/questions/1742/how-to-insert-file-data-into-a-postgresql-bytea-column

https://www.microolap.com/products/connectivity/postgresdac/help/tipsandtricks_byteavsoid.htm

1. 整数 类型 类型 smallint、integer和bigint 存储 各种范围的全部是数字的数,也就是没有小数部分的数字。试图 存储 超出范围以外的数值将导致一个错误。常用的 类型 是integer,因为它提供了在范围、 存储 空间和性能之间的最佳平衡。一般只有在磁盘空间紧张的时候才使用smallint。而只有在integer的范围不够的时候才使用bigint,因为前者(integer)绝对快得多。     2. 任意精度数值: 类型 numeric可以 存储 最多1000位精度的数字并且准确地进行计算。因 For learning purposes, I'm creating a site using Python+Flask. I want to recover an image from database and show it on screen. But one step at a time.I have no idea how to save an image in my database... 这一章主要介绍四个概念: 数据 库集群的逻辑结构 数据 库集群的物理结构表文件的内部布局读写 数据 元组的方法01— 数据 库集群的逻辑结构Pg中的集群,也即database cluster,是由 PostgreSQL 服务端来管理的一组 数据 库(database)的集合。注意这里是 数据 库(database)的集合,不是 数据 库服务(database servers)的集合。一个 PostgreSQL 服务器运行在... public Result<SysImageVO> uploadImg(SysImageVO sysImageVO, MultipartFile imgFile) throws IOException { Result<SysImageVO> result = new Result<>(); sysImageVO.setContent(imgFile.get Byte s()); sysImageSer PgBulkInsert PgBulkInsert是一个Java库,用于使用Binary COPY 协议批量插入 PostgreSQL 。 它提供了 PostgreSQL 的包装器: 是 PostgreSQL 特有的功能,它允许高效地批量导入表或从表导出 数据 。 与使用INSERT和SELECT相比,这是将 数据 进出表的更快的方法。 没有出色的库,该项目将无法实现,该库具有 Post gres协议的漂亮实现。 在Central Maven 存储 库中可用。 您可以将以下依赖项添加到pom.xml中,以在项目中包含 。 < dependency> < groupId>de. byte fish 一直以为保存 图片 postgreSql 中表中保存 图片 的字段 类型 byte a,经过反复测试一直没有解决,故采用了TEXT 类型 来保存 图片 ,具体方法如下:保存:BL层:public bool SavePictureToDB(){try{Stream s = File.Open(file, FileMode.Open, FileAccess.Read);int leng = 0;if (s.Length ... 还需要带上有关的动态库文件,它们可以在安装路径下找到,C:\Program Files\ PostgreSQL \14\bin。2、用户自己写的qt操作 PostgreSql 的应用程序,发布时,除了需要 数据 库插件,(1)设计表,把 二进制 图片 定义为 byte a 类型 。1、Windows安装 PostgreSql 。安装时,去掉勾选pgadmin4。初始 数据 post gres。用户名 post gres。 PostgreSQL 让人着迷的地方,不在于他比某些 数据 库的流行,也不在于比某些 数据 库的高“贵”, 更不如某些 数据 库的“简单”。 Postgresql 让人无法自拔的是他的”多端变化”, 用开发的角度来说,叫多态性。PG本身支持着太多的 数据 类型 充分体现了他的多态性,其中hstore 数据 类型 ,这是一种以键值为目的的 数据 存储 和提取的方式。在非结构化,半结构化 数据 横行的今天,除了MONGODB 让人“羡... PostgreSQL ™提供了两种不同的方式来 存储 二进制 数据 二进制 数据 可以 存储 在一个表中使用的 数据 类型 BYTE A或使用的大对象特性将 二进制 数据 存储 在一个单独的表在一个特殊的表的格式,是指你的表中 存储 一个值 类型 的OID。 为了确定哪种方法是合适你需要理解每个方法的局限性。 BYTE A 数据 类型 并不适合 存储 大量的 二进制 数据 。而列的 类型 BYTE A可容纳1 GB的 二进制 数据 ,这需要大量的内存来处理如此大的价 //方式一:将文件转成字节数组,采用原生sql存到 数据 库 if(StringUtils.isNotEmpty(multipartFile.getOriginalFilename())) { //获取file文件 CommonsMultipartFile cmf = (CommonsMultipartFile) mul copy 命令 用于在 postgreSql 表和标准文件系统直接传输 数据 copy 命令 PostgreSQL 服务器直接读写文件,因此文件必须位于服务器本地或能被直接访问。 该 命令 仅能在表上使用,不能用于视图; 拷贝表至文件 1、使用空格作为字段直接的分隔 COPY test_table TO 'save_file_folder/test_data. copy ' WITH DELIMITER ' '; 2、 二进制 文件 COPY t... 经过测试:JAVA存取 PostgreSQL byte a 类型 均存在内存的限制问题(存取的 数据 过大会出现out of memory内存溢出的问题),在EnterpriseDB对此做了优化。取 PostgreSQL 中的 byte a,并 存储 到硬盘上./*** @author Liu Yuanyuan*/private void get Byte a{Connection conn = null;Statement...