从Stdin复制PostgreSQL

270 阅读6分钟

PostgreSQL像其他数据库管理系统一样支持标准流。这些流负责操作数据以存储在PostgreSQL中。这些是应用程序和执行时创建的环境之间的输入和输出通信渠道。

每当我们在PostgreSQL中执行一个命令时,流会与psql(shell)运行的文本终端进行连接。然而,在继承的情况下,每个子进程都会继承父进程的流。不是每个程序都需要在代码中引入这些流,一些函数如getchar()和putchar()会自动使用输入和输出流。流位于3个类别中。

Stdin:它是一个标准输入流。它用于程序读取输入数据的地方。

Stdout。这意味着当应用程序将数据(输出)写入文件时使用的标准输出流。

Stderr。这个流指的是应用程序中的错误。它用于显示或通知用户在执行过程中发生的错误。

这三种类型的常用语法是。

FILE*stdin;

FILE*stdout;

FILE*stderr。

标准输入由输入设备 "键盘 "读取,而标准输出和标准错误则显示在输出设备监控屏幕上。前两个数据流用于获取和显示简单的数据,但第三个数据流主要用于我们需要诊断错误的时候。我正在谈论编程语言中的异常处理。

标准输入(stdin)。

在创建源代码时,大多数函数都依赖于stdin流的输入功能。但有些程序如dir和ls程序不需要这个功能,因为它们接受命令行参数。这种情况发生在程序依赖系统的输入,但不与用户互动的时候。例如,与目录和路径有关的程序不需要输入就可以执行。

在执行过程中的每个文件都被系统分配了一个唯一的号码。这被称为文件描述符。对于标准输入,文件描述符的值是 "0"。在C语言编程中,文件描述符<stdio.h>有变量文件*stdin,类似地,对于C++语言,变量被定义为std : : cin。

PostgreSQL中的stdin

在安装和配置数据库后,为了与服务器连接,你需要提供一个密码才能进一步进行。这些措施是为了验证用户的身份。

从stdin复制数据到一个表

为了确认stdin的机制,我们需要创建一个假表。这样,我们就可以通过加入stdin来读取和复制文件中的数据到另一个文件。

>>创建 school(idint,namevarchar(10),addressvarchar(20),Subjectvarchar(20))。

一旦表被创建,我们将通过使用插入命令在表中添加数值。在几行中添加一些样本数据,其余的将通过 "STDIN "添加。

>> insert intoschoolvalues ( 1, 'Ahmad', 'lahore', 'sciences'),( 2, 'shazain', 'Islamabad','Arts'),( 3, 'Zain', 'karachi','sciences')

除了 "INSERT "语句外,还有一个替代方法来加载表中的值。这就是通过 "STDIN"。在PostgreSQL中,我们使用一个分隔符从终端逐行输入数据到表中。这个分隔符是一行中两列数值之间的分隔符。这个分隔符在任何情况下都可以是一个空格、逗号或一个空白。但建议使用stdin的分隔符,CSV(逗号分隔的值)。而且这里没有提到其他符号。使用了一个关键字'COPY',它将把数据从psql屏幕上复制到表格中,特别是。

>>Copy schoolfromstdin(Delimiter ',');

当你使用查询时,这里提到了一些关于数据放置的说明。这些是指导用户的要点,所以你必须能够正确地输入数据。每一行都应该在一个新的行中输入。

我们将在这里一步一步地进行。写在逗号之前或之间的每个值代表每一列。因为,有4列,所以有4个值作为CSV。输入第一行,然后按tab键。

当一行完成后,你就会被移到下一行。无论你想增加多少行,就像插入语句一样,所有无限的数据都将被放置在表格中。回到这个例子,现在我们已经写完了第二行,然后继续写下一行。

我们使用了2行来演示。实际插入的数据将达到要求的标记。如果你已经完成了在表中添加行的工作,并想退出这个机制,你肯定会使用文件结束(EOF)。

当你不想再添加行时,你需要在最后一行用反斜杠(\)和句号(.)来结束添加数据。

现在让我们最后看一下从查询到EOF的整个代码。在最后,"copy 3 "表示有3行被添加到表中。

注意:EOF操作符没有作为一个符号添加到表格的新行中。

根据要求,继续通过 "stdin "添加数据。你可以通过select语句检查你所插入的数据。

>> select * fromschool;

从表复制数据到stdin

如果你有兴趣从表中复制一个表的数据,那么我们使用stdin来实现。在PostgreSQL中不可能直接将一个表复制到另一个表中。

创建一个样本表,从表(学校)中复制所有数据。应该注意添加列的数据,类型与目标表相似。

现在,使用相同的stdin语句添加该文件的数据的拷贝。数据可以是相同的,或者你可以通过添加一个在原始表中没有的新行来改变它。

>>copy school_copyfromstdin(delimeter ',')

使用select语句来获取输入的数据。

使用STDOUT而不是SELECT语句进行输出

由于我们使用stdin来替代插入语句。同样地,STDOUT也被用来代替select语句。其表现形式不是以表格的形式。对于输出的目的,使用的分隔符是"|"。这个分隔符会自动放在每行的列之间。

>>copy school_copytostdout(DELIMITER '|')。

使用定界符时产生的错误
DELIMITER '|'


如果你使用分隔符'|'来代替CSV,会引起错误。这将不会从终端复制数据,并导致语法错误。

结论

PostgreSQL从stdin复制 "可以帮助将一个表的数据复制到另一个表。在这篇文章中,我们首先给你介绍了标准流,stdin,它的工作原理,然后是对例子的简单解释。与插入语句相比,stdin的一个竞争优势是,如果在复制数据时错误地跳过了某一行,我们可以在现有的行之间添加它。在本教程的指导下,你将能够复制表的内容。