Popular banco de dados MySQL

2,703 views
Skip to first unread message

Marcio Junior

unread,
Mar 6, 2012, 9:09:27 AM3/6/12
to ph...@googlegroups.com
Bom dia Pessoal.


Escrevi um script para popular uma tabela de um banco de dados MySQL.

Estava precisando de fazer uns testes, mas para isso era preciso ter uma tabela com muitos dados (acima de 1 milhão de registros), ai resolvi escrever esse script (código aberto).





Abraços,


Guilherme Almeida David Diniz Ferreira

unread,
Mar 6, 2012, 9:16:17 AM3/6/12
to ph...@googlegroups.com
$popular->vai(), haha. Parabens pela iniciativa.

Abs.
--
Guilherme "Storm" David



--
Você recebeu esta mensagem porque está inscrito no grupo "PHP MG" no grupos do Google.
Site oficial do grupo: http://www.phpmg.com
Para postar neste grupo, envie um e-mail para ph...@googlegroups.com
Para cancelar a sua inscrição neste grupo, envie um e-mail para phpmg-un...@googlegroups.com
Regras da lista: http://groups.google.com/group/phpmg/web/regras-da-lista
Para ver mais opções, acesse http://groups.google.com/group/phpmg

Rafael Nogueira

unread,
Mar 6, 2012, 9:34:51 AM3/6/12
to ph...@googlegroups.com
Mto bacana marcio, vou adapta-la depois para alguns tipos de dados do sqlserver, pois ja precisei disso anteriormente.

E não puder deixar de comentar, #rialto aki com a função "vai" para executar o script hehehehehhehe

Enfim, vlw pela colaboração.

2012/3/6 Marcio Junior <mar...@camposmotta.com.br>

--
Você recebeu esta mensagem porque está inscrito no grupo "PHP MG" no grupos do Google.
Site oficial do grupo: http://www.phpmg.com
Para postar neste grupo, envie um e-mail para ph...@googlegroups.com
Para cancelar a sua inscrição neste grupo, envie um e-mail para phpmg-un...@googlegroups.com
Regras da lista: http://groups.google.com/group/phpmg/web/regras-da-lista
Para ver mais opções, acesse http://groups.google.com/group/phpmg



--

    Rafael Nogueira Santos 
--
MCTS: SQL Server 2008, Database Development
MCTS: .NET Framework 4, Service Communication Applications
MCTS: .NET Framework 4, Data Access
MCTS: .NET Framework 4, Web Applications
MCPD: Web Developer 4
Exin/ISO 27002 Information Security Certified Professional
--

Diego Henrique Oliveira

unread,
Mar 6, 2012, 9:41:43 AM3/6/12
to ph...@googlegroups.com
Normalmente eu uso o Faker: https://github.com/fzaninotto/Faker

Ele é otimo pra isso, principalmente quando vc precisa de um banco com muitos registros pra testar a perfomance de queries.



Abraços





2012/3/6 Guilherme Almeida David Diniz Ferreira <con...@guilhermedavid.com.br>

Marcio Junior

unread,
Mar 6, 2012, 9:41:19 AM3/6/12
to ph...@googlegroups.com
Obrigado Rafael e Guilherme.

Vai - ehehehehe.

em todo script tem GO então resolvi traduzir. hehehehehehhe


Rafael,

Depois que você adapta-la para SQLServer posta lá no GitHub.


Abraços,

Marcio Junior

unread,
Mar 6, 2012, 9:43:51 AM3/6/12
to ph...@googlegroups.com
Diego,

Esse eu não conhecia, por isso fiz um. ehehe

vou testa-lo aqui.

Abraços,

Rafael Nogueira

unread,
Mar 6, 2012, 9:59:52 AM3/6/12
to ph...@googlegroups.com
Tb n conhecia o Faker, valeu pela contribuição ;)

2012/3/6 Marcio Junior <mar...@camposmotta.com.br>



--

Rattones B-)

unread,
Mar 6, 2012, 10:13:45 AM3/6/12
to ph...@googlegroups.com
eu uso este site 

muito bom .. 


Marcelo Ratton - Desenvolvedor Web
Celular: (37) 8803-7142
Telefone: (31) 35150690
Email: ratt...@marceloratton.com
http://www.marceloratton.com
---
Oh!!! .. o campeão voltou .. o campeão voltou .. oh!!!! ... BUGRE ...
=====================================================
NETqueta:
Se você repassar esta mensagem, por favor:
1. Apague o MEU ENDEREÇO eletrônico;
2. Encaminhe CCO ou BCC (CÓPIA OCULTA) aos seus destinatários;
Esse é um GESTO de Carinho e Respeito, que preservará o endereço de
todos evitando tanto vírus na internet. Meus agradecimentos.
=====================================================

Marcio Junior

unread,
Mar 6, 2012, 10:47:09 AM3/6/12
to ph...@googlegroups.com
Esse http://www.generatedata.com/#generator  é bom mesmo...

Abraços,




Marcus Paulo Mazzon Dias

unread,
Mar 6, 2012, 10:57:04 AM3/6/12
to ph...@googlegroups.com
Marcio vou dar um upgrade na sua classe e te mando ai ok...

Em 6 de março de 2012 12:13, Rattones B-) <ratt...@gmail.com> escreveu:

--
Você recebeu esta mensagem porque está inscrito no grupo "PHP MG" no grupos do Google.
Site oficial do grupo: http://www.phpmg.com
Para postar neste grupo, envie um e-mail para ph...@googlegroups.com
Para cancelar a sua inscrição neste grupo, envie um e-mail para phpmg-un...@googlegroups.com
Regras da lista: http://groups.google.com/group/phpmg/web/regras-da-lista
Para ver mais opções, acesse http://groups.google.com/group/phpmg



--
Att. Marcus Paulo Mazzon Dias

Marcus Paulo Mazzon Dias

unread,
Mar 6, 2012, 11:21:56 AM3/6/12
to ph...@googlegroups.com
Marcio testa ai e ve se ficou legal. nao testei pq estou no trampo..

<?php

/**
 * Arquivo que contem a classe de Popular
 *
 *
 * PHP 5
 *
 * Copyright (c) 2012 Marmottajr Twitter: @marciomottajr
 * @author Márcio R. Motta Júnior <mar...@camposmotta.com.br>
 * @version v 1.0 06/03/2012 10:17:00
 * @filesource
 **/

class Popular {

    private $conexao = '';
    private $host;
    private $user;
    private $password;
    private $database;
    private $tipos = array('integer', 'string', 'decimal', 'date', 'datetime');
    private $limiteBulk = '500';
    private $tabela;
    private $campos = array();
    private $autoCampos;

    public function __construct($host, $user, $password, $database, $tabela, $autoCampos = false) {

        set_time_limit(-1);

        $this -> host = $host;
        $this -> user = $user;
        $this -> password = $password;
        $this -> database = $database;
        $this -> tabela = $tabela;
        $this -> autoCampos = $autoCampos;
    }

    private function conectar() {
        if ($conexao = @mysql_connect($this -> host, $this -> user, $this -> password)) {
            if (@mysql_select_db($this -> database)) {
                return true;
            } else {
                throw new Exception("Erro: " . mysql_errno() . " - " . mysql_error());
            }
        } else {
            throw new Exception("Erro: " . mysql_errno() . " - " . mysql_error());
        }

    }

    private function getCamposBd() {
        $result = mysql_query("SHOW COLUMNS FROM `{$this->table}`");
        if (!$result) {
            if (mysql_num_rows($result) > 0) {
                while ($row = mysql_fetch_assoc($result)) {
                    $this -> analiseCampos($row);
                }
                return true;
            }
        }
        return false;
    }

    private function analiseCampos($row) {
        if ($row['Extra'] != 'auto_increment')
            return true;

        $pattern = '/([\w]+)\(([0-9,]+)\)/i';
        $replacement = '$1';
        preg_match_all($pattern, $row['Type'], $matchs);

        list($max, $casasDecimais) = explode(',', $matchs[2]);

        if ($row['Null'] == 'Yes')
            $min = 0;
        else
            $min = 1;

        if ($max < $min)
            $max = $min;

        $this -> campos[] = array($row['Field'], $matchs[1], $min, $max, $casasDecimais);
        return true;
    }

    private function execucao() {
        $sec = explode(" ", microtime());
        $tempo = $sec[1] + $sec[0];
        return $tempo;
    }

    public function adicionarColuna($nome, $tipo, $min, $max, $casasDecimais = '') {

        if (in_array($tipo, $this -> tipos)) {
            $this -> campos[] = array($nome, $tipo, $min, $max, $casasDecimais);
        } else {
            throw new Exception("Erro: Tipo de coluna inválida");
        }

    }

    private function sorteia($tipo, $min, $max, $casasDecimais = '') {
        $texto = "";

        if ($tipo == 'string') {

            $caracteres = "abcdefghijklmnopqrstuwxyz ";
            $max = rand($min, $max);
            for ($i = 0; $i < $max; $i++) {
                $texto .= $caracteres[rand(0, strlen($caracteres))];
            }

        } else if ($tipo == 'integer') {

            $texto = rand($min, $max);

        } else if ($tipo == 'decimal') {

            $texto = rand($min, $max);

            $maxCasas = '';

            for ($i = 0; $i < $casasDecimais; $i++) {
                $maxCasas .= "9";
            }

            $casas = rand(0, $maxCasas);
            $casas = sprintf("%0" . $casasDecimais . "d", $casas);

            $texto .= "." . $casas;

        } else if ($tipo == 'date') {

            $texto = $this -> makeRandomDateInclusive($min, $max);

        } else if ($tipo == 'datetime') {

            $texto = $this -> makeRandomDateInclusive($min, $max);

            $hora = sprintf("%02d", rand(0, 23));
            $minuto = sprintf("%02d", rand(0, 59));
            $segundo = sprintf("%02d", rand(0, 59));

            $texto .= " " . $hora . ":" . $minuto . ":" . $segundo;

        }

        return $texto;
    }

    private function makeRandomDateInclusive($startDate, $endDate) {
        $days = round((strtotime($endDate) - strtotime($startDate)) / (60 * 60 * 24));
        $n = rand(0, $days);
        return date("Y-m-d", strtotime("$startDate + $n days"));
    }

    public function vai($totalRegistros) {
        $tempoInicio = $this -> execucao();

        $this -> conectar();

        if ($this -> autoCampos)
            $this -> getCamposBd();

        $sqlInicio = "insert into " . $this -> tabela . " (";
        foreach ($this->campos as $key => $value) {
            $sqlInicio .= $value[0] . ",";
        }
        $sqlInicio = substr($sqlInicio, 0, -1) . ") values ";

        $registros = "";

        for ($i = 1; $i <= $totalRegistros; $i++) {

            $registro = "(";

            foreach ($this->campos as $key => $value) {
                $valor = $this -> sorteia($value[1], $value[2], $value[3], $value[4]);
                if ($value[1] == 'integer') {
                    $registro .= $valor . ",";
                } else {
                    $registro .= "'" . $valor . "',";
                }

            }

            $registro = substr($registro, 0, -1) . ")";
            $registros .= $registro . ",";

            if ($i % $this -> limiteBulk == 0) {
                $registros = substr($registros, 0, -1);
                if (!mysql_query($sqlInicio . $registros)) {
                    throw new Exception("Erro: " . mysql_errno() . " - " . mysql_error());
                }
                $registros = "";
            }
        }

        if ($registros != "") {
            $registros = substr($registros, 0, -1);
            if (!mysql_query($sqlInicio . $registros)) {
                throw new Exception("Erro: " . mysql_errno() . " - " . mysql_error());
            }
        }

        $tempoFim = $this -> execucao();

        return number_format(($tempoFim - $tempoInicio), 3);
        //retorna o tempo de execuçao em milesegundos

    }

}
?>

na construct coloquei o campo autoCampos, onde ele vai no banco pega as especificoes do banco e preenche tudo automaticamente. depois detalho direitinho.

Marcus Paulo Mazzon Dias

unread,
Mar 6, 2012, 11:37:55 AM3/6/12
to ph...@googlegroups.com
private function getCamposBd() {
        $result = mysql_query("SHOW COLUMNS FROM `{$this->tabela}`");
        if ($result) {
            mysql_num_rows($result);

            if (mysql_num_rows($result) > 0) {
                while ($row = mysql_fetch_assoc($result)) {
                    $this -> analiseCampos($row);
                }
                return true;
            }
        }
        return false;
    }

    private function analiseCampos($row) {
        if ($row['Extra'] == 'auto_increment')

            return true;

        $pattern = '/([\w]+)\(([0-9,]+)\)/i';
        $replacement = '$1';
        preg_match_all($pattern, $row['Type'], $matchs);

        list($max, $casasDecimais) = explode(',', $matchs[2]);

        if ($row['Null'] == 'Yes')
            $min = 0;
        else
            $min = 1;

        if ($max < $min)
            $max = $min;
        $this -> adicionarColuna($row['Field'], $matchs[1], $min, $max, $casasDecimais);
        return true;
    }

precisa mudar tmb o constructor

Márcio Junior

unread,
Mar 6, 2012, 11:44:39 AM3/6/12
to ph...@googlegroups.com
Blz Marcus.  

Assim que eu chegar na empresa testo e posto no Github seu upgrade.

Obrigado. 

Enviado via iPhone

Lucas Mendes de Freitas

unread,
Mar 6, 2012, 1:17:06 PM3/6/12
to ph...@googlegroups.com
function vai() KKKKKKKKKKKKKKKKKKKKKKKKK boooa, foi uma otima iniciativa =)
Lucas Mendes de Freitas
Gerente de Desenvolvimento
SDMF Development
+55 31 9416-3842



"Antes de imprimir pense em seu compromisso com o meio ambiente!"

Marcus Paulo Mazzon Dias

unread,
Mar 6, 2012, 1:29:20 PM3/6/12
to ph...@googlegroups.com
gostei da nomeclatura kk as proximas classes que eu fizer vai ser function vai_safada()

Márcio Junior

unread,
Mar 6, 2012, 1:50:08 PM3/6/12
to ph...@googlegroups.com
Kkkkkkkk

Q bom q gostaram.  Rs 

A próxima vai ser: vaiQueToTeVendo() hehehe

Ou 

vaiMasNaoDemora(). Kkkkkkk

Enviado via iPhone

Rattones B-)

unread,
Mar 6, 2012, 1:50:25 PM3/6/12
to ph...@googlegroups.com
sugestões de nomes 
doTheMagic()
shazam() 
abracadabra()

uhauhuhahua .. mas o q vale é a intensão e manter o padrão .. uhauhuhahauhu 

Lucas Mendes de Freitas

unread,
Mar 6, 2012, 2:13:08 PM3/6/12
to ph...@googlegroups.com
No dia que eu achei uma função num codigo chamada ->abratecesamo() (pra criar a conexão com o SOAP) nunca mais ri tanto de algum codigo. HAUEHUhauuehuhAE

Bem que podia ter um topico de perolas de codigos aqui no grupo ne?

--
Você recebeu esta mensagem porque está inscrito no grupo "PHP MG" no grupos do Google.
Site oficial do grupo: http://www.phpmg.com
Para postar neste grupo, envie um e-mail para ph...@googlegroups.com
Para cancelar a sua inscrição neste grupo, envie um e-mail para phpmg-un...@googlegroups.com
Regras da lista: http://groups.google.com/group/phpmg/web/regras-da-lista
Para ver mais opções, acesse http://groups.google.com/group/phpmg

Heitor Neto Carvalho

unread,
Aug 28, 2014, 7:28:33 AM8/28/14
to ph...@googlegroups.com
Bom dia Pessoal!

Estou com um problema e gostaria da ajuda de vocês, eu preciso popular duas tabelas "tbl_album" e "tbl_fotos" com um grande volume de dados para teste de desempenho, porem, não sei como fazer.

Eu preciso gravar na tabela foto as fotos e não o caminho delas. 

Alguma dica de vocês? Desde já agradeço.

Jaderson Barreto Sathler

unread,
Sep 4, 2014, 4:50:45 PM9/4/14
to ph...@googlegroups.com
http://forum.codecall.net/topic/40286-tutorial-storing-images-in-mysql-with-php/


Atenciosamente,

Jaderson Barreto Sathler
Analista de Sistemas
Brasília, DF, Brasil

--
"A derrota de um indivíduo não está no tamanho ou no grau das dificuldades e obstáculos que experimenta, mas sim na sua prematura desistência das coisas."


--
Você recebeu esta mensagem porque está inscrito no grupo "PHP MG" no grupos do Google.
Site oficial do grupo: http://www.phpmg.com
Para postar neste grupo, envie um e-mail para ph...@googlegroups.com
Para cancelar a sua inscrição neste grupo, envie um e-mail para phpmg-un...@googlegroups.com
Regras da lista: http://groups.google.com/group/phpmg/web/regras-da-lista
Para ver mais opções, acesse http://groups.google.com/group/phpmg
---
Você recebeu essa mensagem porque está inscrito no grupo quot;PHP MG" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para phpmg+un...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Reply all
Reply to author
Forward
0 new messages