{"id":330,"date":"2012-08-09T14:22:22","date_gmt":"2012-08-09T17:22:22","guid":{"rendered":"http:\/\/linuxrs.com.br\/?p=330"},"modified":"2012-08-09T14:22:22","modified_gmt":"2012-08-09T17:22:22","slug":"consultas-sql-pelo-terminal-no-postgres-mysql-sql-server","status":"publish","type":"post","link":"https:\/\/blog.clusterweb.com.br\/?p=330","title":{"rendered":"Consultas SQL pelo Terminal no Postgres, Mysql, SQL Server"},"content":{"rendered":"<p><strong>Introdu\u00e7\u00e3o<\/strong><\/p>\n<div>No meu dia a dia, e de muitos que possam est\u00e1 lendo este artigo, tenho que fazer diversas consultar em tabelas, \u00e0s vezes dispostas em Sistemas Gerenciadores de Banco de Dados (SGBD) diferentes. Para este tipo de situa\u00e7\u00e3o, o <a href=\"http:\/\/eclipsesql.sourceforge.net\/\">Eclipse SQL Explorer<\/a> funciona muito bem, mas muitas vezes, s\u00e3o consultas simples e abrir este software ou qualquer outro para fazer a consulta pode ser desnecess\u00e1rio&#8230;<\/p>\n<p>Ent\u00e3o pensei em fazer algo simples, por\u00e9m \u00fatil, um script em PHP que fa\u00e7a a consulta e apresente na sa\u00edda padr\u00e3o ( no terminal ).<\/p>\n<p>Poderia ter sido usado qualquer outra linguagem de programa\u00e7\u00e3o, usei o PHP por sua conex\u00e3o com diferentes SGBD ser bem f\u00e1cil e no momento estou mais familiarizado com sua sintaxe.<\/p>\n<h1>Preparando o Ambiente<\/h1>\n<p>Caso n\u00e3o tenha o PHP instalado ainda:<\/p>\n<p><strong>$ sudo apt-get install php5<\/strong><\/p>\n<p>Para este artigo, preparei o ambiente para realizar consultar no Postgres, MySQL e MS SQL Server.<\/p>\n<p>Instale os m\u00f3dulos necess\u00e1rios para o PHP realizar a conex\u00e3o:<\/p>\n<p><strong>$ sudo apt-get install php5-pgsql php5-mysql php5-sybase<\/strong><\/p>\n<p>Obs.: O <em>php5-sybase<\/em> \u00e9 um m\u00f3dulo usado tanto para o Sybase como para o MS SQL Server.<\/p>\n<p>Com a ajuda de um terminal embutido, como <a href=\"http:\/\/www.vivaolinux.com.br\/dica\/Terminal-Guake\/\">Guake<\/a>, voc\u00ea nem vai precisar ir at\u00e9 um terminal usando o menu, basta usar o atalho configurado.<\/p>\n<p>Ao final desse artigo teremos a possibilidade de fazer algo como:<\/p>\n<div><a href=\"http:\/\/img.vivaolinux.com.br\/imagens\/artigos\/comunidade\/shellquery000.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/img.vivaolinux.com.br\/imagens\/artigos\/comunidade\/thumb_shellquery000.png\" alt=\"Linux: Consultar SQL pelo terminal\" width=\"500\" height=\"267\" border=\"0\" \/><\/a><\/div>\n<div><a href=\"http:\/\/img.vivaolinux.com.br\/imagens\/artigos\/comunidade\/shellquery003.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/img.vivaolinux.com.br\/imagens\/artigos\/comunidade\/shellquery003.png\" alt=\"Linux: Consultar SQL pelo terminal\" width=\"750\" height=\"474\" border=\"0\" \/><\/a><\/div>\n<\/div>\n<p><strong>M\u00e3o na massa ( O script PHP )<\/strong><\/p>\n<div>\n<h1>Arquivo de conex\u00e3o<\/h1>\n<p>Para realizar a conex\u00e3o com o SGBD fiz a classe DataBase ler um arquivo &#8220;.ini&#8221;, onde o mesmo \u00e9 nomeado com o nome do SGBD seguido pelo nome da base de dados, e dentro dele seguem os dados do servidor (host), usu\u00e1rio, senha e opcionalmente a porta.<\/p>\n<p>Exemplo de arquivo de configura\u00e7\u00e3o para conex\u00e3o:<\/p>\n<div>host\u00a0\u00a0\u00a0\u00a0= 192.168.0.100<br \/>\nuser\u00a0\u00a0\u00a0\u00a0= postgres<br \/>\npass\u00a0\u00a0\u00a0\u00a0 = gnuxx22l1n1<\/div>\n<h1>Classe de conex\u00e3o<\/h1>\n<p>Seque o c\u00f3digo da classe de conex\u00e3o com os SGBD:<\/p>\n<div>&lt;?php<br \/>\n\/*<br \/>\n* classe DataBase<br \/>\n* Gerencia conexoes com bancos de dados atrav\u00e9s de arquivos de configuracao.<br \/>\n* Baseada em TConnection.class.php do livro: PHP Programando com Orienta\u00e7\u00e3o a Objetos (Pablo Dall&#8221;Oglio)<br \/>\n*\/<\/p>\n<p>class DataBase<br \/>\n{<br \/>\npublic static $conn;<\/p>\n<p>private function __construct() {}<\/p>\n<p>\/*<br \/>\n* metodo open()<br \/>\n* recebe o nome do banco de dados e instancia o objeto PDO correspondente<br \/>\n* o arquivo segue o padrao: tipobanco_nomebase<br \/>\n*\/<br \/>\nprivate function open( $arquivo )<br \/>\n{<br \/>\n\/\/ verifica se existe o arquivo<br \/>\nif ( file_exists( &#8220;{$arquivo}.ini&#8221;) )<br \/>\n{<br \/>\n\/\/ le o INI e retorna um array<br \/>\n$nome = explode(&#8216;_&#8217;, $arquivo );<br \/>\n$tipoBanco = $nome[0];<br \/>\n$nomeBase = $nome[1];<br \/>\n$db = parse_ini_file(&#8220;{$arquivo}.ini&#8221;);<br \/>\n}<br \/>\nelse<br \/>\n{<br \/>\n\/\/ se nao existir, lanca um erro<br \/>\nthrow new Exception(&#8220;Arquivo &#8216;$arquivo&#8217; nao encontrado&#8221;);<br \/>\n}<\/p>\n<p>\/\/ le as informacoes contidas no arquivo<br \/>\n$usuario = isset($db[&#8216;user&#8217;]) ? $db[&#8216;user&#8217;] : NULL;<br \/>\n$senha = isset($db[&#8216;pass&#8217;]) ? $db[&#8216;pass&#8217;] : NULL;<br \/>\n$host = isset($db[&#8216;host&#8217;]) ? $db[&#8216;host&#8217;] : NULL;<br \/>\n$porta = isset($db[&#8216;port&#8217;]) ? $db[&#8216;port&#8217;] : NULL;<\/p>\n<p>\/\/ descobre qual o tipo (driver) de banco de dados a ser utilizado<br \/>\nswitch ( $tipoBanco )<br \/>\n{<br \/>\ncase &#8216;pgsql&#8217;:<br \/>\n$porta = $porta ? $porta : &#8216;5432&#8217;;<br \/>\n$conn = new PDO(&#8220;pgsql:dbname={$nomeBase}; user={$usuario}; password={$senha};<br \/>\nhost=$host;port={$porta}&#8221;);<br \/>\nbreak;<br \/>\ncase &#8216;mysql&#8217;:<br \/>\n$porta = $porta ? $porta : &#8216;3306&#8217;;<br \/>\n$conn = new PDO(&#8220;mysql:host={$host};port={$porta};dbname={$nomeBase}&#8221;, $usuario, $senha);<br \/>\nbreak;<br \/>\ncase &#8216;mssql&#8217;:<br \/>\n$conn = new PDO(&#8220;dblib:host={$host};dbname={$nomeBase};charset=UTF-8&#8221;, $usuario, $senha);<br \/>\nbreak;<br \/>\n}<br \/>\n\/\/ define para que o PDO lance excecoes na ocorrencia de erros<br \/>\n$conn-&gt;setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);<br \/>\n\/\/ retorna o objeto instanciado.<br \/>\nreturn $conn;<br \/>\n}<\/p>\n<p>\/*<br \/>\n* Metodo que implementa o padrao Singleton<br \/>\n* O mesmo retorna a instancia de conexao de um banco caso ja exista<br \/>\n* Evitando a criacao de uma nova a cada solicitacao<br \/>\n*\/<\/p>\n<p>public static function getConn( $nomeArquivo ) {<br \/>\nif ( ! isset( self::$conn[$nomeArquivo] ) ) {<br \/>\nself::$conn[$nomeArquivo] = DataBase::open( $nomeArquivo );<br \/>\n}<br \/>\nreturn self::$conn[$nomeArquivo];<br \/>\n}<br \/>\n}<br \/>\n?&gt;<\/p><\/div>\n<h1>Script de consulta (shellquery)<\/h1>\n<p>Agora o c\u00f3digo do script PHP que realiza de fato a consulta no banco de dados, mediante par\u00e2metros fornecidos via terminal.<\/p>\n<div>#!\/usr\/bin\/php<br \/>\n&lt;?php<br \/>\n# uso: shellquery tipoBanco_nomeBase &#8220;comandoSQL&#8221;<br \/>\ninclude_once &#8220;DataBase.class.php&#8221;;<br \/>\n#&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br \/>\n$mostraNomeCampos = TRUE;<br \/>\n$banco = isset( $argv[1] ) ? $argv[1] : NULL;<br \/>\n$sql = isset( $argv[2] ) ? $argv[2] : NULL;<br \/>\n# se for passado um terceiro argumento, n\u00e3o exibe o nome dos campos<br \/>\nif ( isset( $argv[3] ) ) $mostraNomeCampos = FALSE;<\/p>\n<p>if ( $banco == NULL || $sql == NULL ) {<br \/>\necho &#8220;Sintaxe {$argv[0]} nomeArquivoConfiguracao comandoSQL\\n&#8221;;<br \/>\nexit;<br \/>\n}<\/p>\n<p>try {<br \/>\n$conn = DataBase::getConn( &#8220;$banco&#8221; );<br \/>\n$rs = $conn-&gt;query( $sql )-&gt;fetchAll();<br \/>\n} catch ( Exception $e ){<br \/>\necho &#8220;Erro: {$e-&gt;getMessage()} :\\nLinha: {$e-&gt;getLine()}\\n&#8221;;<br \/>\nexit;<br \/>\n}<\/p>\n<p>foreach ( $rs as $dados ) {<br \/>\n$ultimaCol = ( count( $dados ) \/ 2 ) &#8211; 1;<\/p>\n<p>if ( $mostraNomeCampos == TRUE ) {<br \/>\n# obtem os nomes dos campos<br \/>\n$key = ( array_keys( $dados ) );<br \/>\n$x=0;<br \/>\nfor ( $i=0; $i &lt; count( $key ); $i++ ) {<br \/>\nif ( is_int( $key[$i] ) ) continue;<br \/>\n$campo[$x] = $key[$i];<br \/>\n$x++;<br \/>\n}<\/p>\n<p># exibe os nomes dos campos<br \/>\nfor ( $i=0; $i &lt; $ultimaCol; $i++ ) {<br \/>\necho &#8220;{$campo[$i]}|&#8221;;<br \/>\n}<br \/>\necho &#8220;{$campo[$ultimaCol]}\\n&#8221;;<br \/>\n}<br \/>\n$mostraNomeCampos = FALSE;<\/p>\n<p># exibe os dados<br \/>\nfor ( $i=0; $i &lt; $ultimaCol; $i++ ) {<br \/>\necho &#8220;{$dados[$i]}|&#8221;;<br \/>\n}<br \/>\necho &#8220;{$dados[$ultimaCol]}\\n&#8221;;<br \/>\n}<br \/>\n?&gt;<\/p><\/div>\n<p>Salve em um arquivo, como shellquery, d\u00ea permiss\u00e3o de execu\u00e7\u00e3o:<\/p>\n<p><strong>$ chmod +x shellquery<\/strong><\/p>\n<p>E use \u00e0 vontade.<\/p>\n<h1>Exemplo de uso<\/h1>\n<p><strong>.\/shellquery pgsql_casa &#8220;SELECT * FROM disciplinas&#8221;<\/strong><\/p>\n<p>Resultado:<\/p>\n<blockquote><p>no_disciplina|id_disciplina<br \/>\nPORTUGUES|1<br \/>\nMATEMATICA|2<br \/>\nGEOGRAFIA|3<br \/>\nHISTORIA|4<\/p><\/blockquote>\n<p>Bom, a sa\u00edda deixei bem simples, exibindo os registros um por linha, separados por &#8220;|&#8221;, assim poder\u00e1 ser usado a seu gosto, para:<\/p>\n<p>&#8211; Quantos registros foram retornados?:<\/p>\n<p><strong>$ .\/shellquery pgsql_casa &#8220;SELECT * FROM disciplinas&#8221; QUALQUERCOISA | wc -l<\/strong><\/p>\n<p>Resultado:<\/p>\n<blockquote><p>4<\/p><\/blockquote>\n<p>&#8211; Criar um arquivo CSV com separdor &#8220;;&#8221; no lugar de &#8220;|&#8221;:<\/p>\n<p><strong>$ .\/shellquery pgsql_casa &#8220;SELECT * FROM disciplinas&#8221; | tr &#8216;|&#8217; &#8216;;&#8217; &gt; resultado.csv<\/strong><\/p>\n<p>Arquivo resultado.csv aberto no libreoffice:<\/p>\n<div><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/img.vivaolinux.com.br\/imagens\/artigos\/comunidade\/shellquery002.png\" alt=\"Linux: Consultar SQL pelo terminal\" width=\"245\" height=\"129\" \/><\/div>\n<p>Enfim, podem ser feitas as infinidades de modifica\u00e7\u00f5es que o <a href=\"http:\/\/www.vivaolinux.com.br\/linux\/\">GNU\/Linux<\/a> permite via shell.<\/p>\n<p>Espero que ajude e facilite a vida de voc\u00eas, pra mim \u00e9 uma m\u00e3o na roda, uso todos os dias!<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Introdu\u00e7\u00e3o No meu dia a dia, e de muitos que possam est\u00e1 lendo este artigo, tenho que fazer diversas consultar em tabelas, \u00e0s vezes dispostas em Sistemas Gerenciadores de Banco de Dados (SGBD) diferentes. Para este tipo de situa\u00e7\u00e3o, o Eclipse SQL Explorer funciona muito bem, mas muitas vezes, s\u00e3o consultas simples e abrir este [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[1,51,68],"tags":[93,162,133,138,161],"class_list":["post-330","post","type-post","status-publish","format-standard","hentry","category-viazap","category-linux-linuxrs","category-redes-2","tag-banco-de-dados-2","tag-firebird","tag-mysql","tag-postgres","tag-sql"],"_links":{"self":[{"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts\/330","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=330"}],"version-history":[{"count":1,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts\/330\/revisions"}],"predecessor-version":[{"id":331,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts\/330\/revisions\/331"}],"wp:attachment":[{"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=330"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=330"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=330"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}