1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

retirar dados de bd myslq com bash script

Discussão em 'Novidades GNU/Linux & *nix World' iniciada por zoidberg, 8 de Junho de 2007. (Respostas: 6; Visualizações: 822)

  1. zoidberg

    zoidberg Folding Member

    Boas, precisava de ajuda para retirar uns dados de uma base de dados para criar um script.

    O que estou a fazer é :
    Código:
    echo "SELECT * FROM relatorio WHERE Turno = 2;" | mysql -u$usr -p$pwd relatorios > /share/relatorios
    
    o que me retorna

    Código:
    ID_Rel  Turno   Data
    49      2       2007-05-31
    51      2       2007-06-01
    53      2       2007-06-04
    56      2       2007-06-05
    59      2       2007-06-06
    63      2       2007-06-08
    
    Contudo se fizer a query " WHERE Data = 2007-06-08 " não me retorna nada..

    pq que será?

    O que necessito mesmo é " WHERE Data = 2007-06-08 AND Turno = 2 " , para pegar valor existente no campo ID_Rel ( neste caso o 63 ). e colocar numa variavel.

    Alguem me consegue ajudar? tks :)
     
  2. metralha761

    metralha761 1st Folding then Sex

    Tenta colocar entre aspas
    Exemplos:
    " WHERE Data = '2007-06-08' "
    ou
    ' WHERE Data = "2007-06-08" '
    ou
    " WHERE Data = \"2007-06-08\" " (penso q tb possa resultar)

    PS: Como tas a ver, se usares um tipo de aspas, podes alternar para outro tipo.
     
    Última edição: 8 de Junho de 2007
  3. zoidberg

    zoidberg Folding Member

    Funcionou! :D hehehe
    e agora? como retiro apenas o valor que pretendo para uma variavel?
    isto :
    Código:
    echo "SELECT ID_Rel FROM relatorio WHERE Data = '$ano-$mes-$dia' AND Turno = $turno;" | mysql -u$usr -p$pwd relatorios > /share/relatorios
    
    agora está-me a retornar isto para dentro do ficheiro relatorios:
    Código:
    ID_Rel
    63
    
    btw, eu não me interessa que vá para detro do ficheiro relatorios, queria era que o valor 63 fosse para uma variavel ( sem usar ficheiros de preferencia )
     
    Última edição: 8 de Junho de 2007
  4. slack_guy

    slack_guy Power Member

    Código:
    $ export MYSQLRESULT=.....
    $ echo $MYSQLRESULT
    
    Parece-me que estás a complicar. Porque não usas Perl/Python e crias uma solução mais consistente?
     
  5. zoidberg

    zoidberg Folding Member

    pq isto é um script que vai ser corrido pelo crontab.
    em relação ao export, como tiro só o 63?
     
  6. slack_guy

    slack_guy Power Member

    A crontab não te impede de utilizar uma linguagem mais versátil.

    O que estás a fazer é ligares à BD pela shell e, ao fazeres um select, a shell do MySQL devolve-te os nomes das colunas (ID_Rel).

    Por outro lado, em Perl, poderia ser uma coisa do género (untested!):
    Código:
    #!/usr/bin/env perl
    use strict;
    use warnings;
    use DBI;
    
    my @defs = @ARGV;
    
    die qq|Número de parâmetros inválido!\n| unless scalar @defs == 2;
    die qq|Data inválida\n| unless $defs[0]=~/^\d{4}-\d{2}-\d{2}$/;
    die qq|Turno inválido\n| unless $defs[1]=~/^\d+$/;
    
    my $dbh = conn_db(
            {
                    'username' => 'user',
                    'password' => 'passwd',
                    'host' => 'localhost',
                    'database' => 'db_name'
            }
    );
    
    my $sql = q|SELECT ID_Rel FROM relatorio WHERE Data = ? AND Turno = ? LIMIT 1|;
    my $sth = $dbh->prepare($sql);
    $sth->execute($defs[0], $defs[1]);
    $sth->bind_columns(\(my $idturno));
    $sth->fetch;
    
    return $idturno;
    
    exit 0;
    
    sub conn_db {
    
            my $self = shift;
    
            my $db_user = $self->{'username'};
            my $db_pass = $self->{'password'};
            my $db_name = $self->{'database'};
            my $db_host = $self->{'host'};
    
            my $_dbh = DBI->connect(
                    qq|DBI:mysql:database=$db_name;host=$db_host|,
                    $db_user, $db_pass
            ) or die(q|Ooopsss... Erro ao ler ligar à BD.|);
    
            $_dbh->{RaiseError} = 1;
    
            return $_dbh;
    
    }
    
    Não te esqueças de
    Código:
    $ chmod 755 teu_script
    
    e na cron terias, por exemplo:
    Código:
    50 * * * * /path/to/script data turno 1>/dev/null
    
     
    Última edição: 8 de Junho de 2007
  7. zoidberg

    zoidberg Folding Member

    hmm vou ver isso do perl, é que não conhecia :P por isso estava a fazer em bash.
    já o consegui fazer, mas vou ver se o passo para perl para aprender :)
    tks slack_guy ;)
     

Partilhar esta Página