README.md
Palestra apresentada no Just Python dia 09 de Novembro de 2019 com Python 3.7.0.
Salvando 14000605 registros no PostgreSQL com Python.
Agradeço a Juliano Atanázio pela ajuda.
README.md
Palestra apresentada no Just Python dia 09 de Novembro de 2019 com Python 3.7.0.
Salvando 14000605 registros no PostgreSQL com Python.
Agradeço a Juliano Atanázio pela ajuda.
| cat > produtos.csv << EOF | |
| produto | |
| Apontador | |
| Caderno 100 folhas | |
| Caderno capa dura 200 folhas | |
| Caneta esferográfica azul | |
| Caneta esferográfica preta | |
| Caneta esferográfica vermelha | |
| Durex | |
| Giz de cera 12 cores | |
| Lapiseira 0.3 mm | |
| Lapiseira 0.5 mm | |
| Lapiseira 0.7 mm | |
| Lápis de cor 24 cores | |
| Lápis | |
| Papel sulfite A4 pacote 100 folhas | |
| Pasta elástica | |
| Tesoura | |
| Agasalho de moleton | |
| Arquivador de 40 mm | |
| Base para tinta | |
| Bloco de papel cavalinho A4 | |
| Borracha | |
| Borracha branca | |
| Caderno de música | |
| Caderno pautado | |
| Caderno quadriculado | |
| Cadernos pautados | |
| Calculadora | |
| Calculadora não gráfica com funções trigonométricas | |
| Calções | |
| Camiseta | |
| Capa arquivadora de desenhos A3 | |
| Chinelos de banho | |
| Compasso | |
| Conjunto de guaches | |
| Corretor de fita | |
| Esferográficas azul | |
| Esferográficas preta | |
| Esferográficas verde | |
| Esferográficas vermelha | |
| Esquadro de 45º | |
| Estojo | |
| Fato de treino | |
| Flauta de bisel | |
| Lápis (H HB B e 6B) | |
| Lápis de cera | |
| Lápis de cor | |
| Lápis HB | |
| Marcadores | |
| Mochila | |
| Pano de limpeza | |
| Pen drive | |
| Pincel n. 2 | |
| Pincel n. 8 | |
| Produtos de higiene | |
| Régua de 20 cm | |
| Régua de 50 cm | |
| Saco para o equipamento | |
| Sapatilhas de desporto | |
| Stick de cola | |
| Toalha | |
| Transferidor | |
| Tubo de cola | |
| EOF | |
| cat produtos.csv |
| import subprocess | |
| import timeit | |
| # Cria db | |
| subprocess.call("createdb -U postgres estoque", shell=True) | |
| # Cria tabela | |
| create_table_sql = "CREATE TABLE produtos (id SERIAL PRIMARY KEY, produto VARCHAR(100));" | |
| create_table_psql = f'psql -U postgres -c "{create_table_sql}" estoque' | |
| subprocess.call(create_table_psql, shell=True) | |
| # Insere os dados | |
| filename = '/tmp/produtos.csv' # ou produtos_14000605.csv | |
| copy_sql = f"COPY produtos (produto) FROM '{filename}' CSV HEADER;" | |
| copy_psql = f'psql -U postgres -c "{copy_sql}" estoque' | |
| tic = timeit.default_timer() | |
| subprocess.call(copy_psql, shell=True) | |
| toc = timeit.default_timer() | |
| print(round(toc - tic, 2), 'segundos') | |
| # 84.77 segundos # para 14000605 | |
| # Retorna os dados | |
| select_sql = "SELECT * FROM produtos LIMIT 5;" | |
| select_psql = f'psql -U postgres -c "{select_sql}" estoque' | |
| subprocess.call(select_psql, shell=True) | |
| # Contando os registros | |
| count_sql = "SELECT COUNT(*) FROM produtos;" | |
| count_psql = f'psql -U postgres -c "{count_sql}" estoque' | |
| subprocess.call(count_psql, shell=True) | |
| # https://github.com/juliano777/pgsql_fs2w |
# Entrando como usuário postgres
sudo su - postgres
# Entrando no banco
psql
show data_directory;
vim /etc/postgresql/10/main/pg_hba.conf
Trocar pra local all postgres trust
sudo systemctl reload postgresql
psql -U postgres
CREATE DATABASE estoque;
\c estoque
\l
\dt
dropdb estoque
createdb estoque
psql estoque
GRANT ALL PRIVILEGES ON DATABASE estoque TO postgres;
\l
CREATE TABLE produtos (id SERIAL PRIMARY KEY, produto VARCHAR(100));
\dt
INSERT INTO produtos (produto) VALUES ('Caneta'), ('Caderno'), ('Papel Sulfite A4');
# Zerar tabela
estoque=# TRUNCATE produtos restart identity;
| import csv | |
| import string | |
| import timeit | |
| from random import choice | |
| def gen_digits(max_length): | |
| return str(''.join(choice(string.ascii_letters) for i in range(max_length))) | |
| def write_csv(filename, max_rows, max_digits): | |
| with open(filename, 'w') as f: | |
| csv_writer = csv.writer(f) | |
| csv_writer.writerow(['produto']) | |
| for i in range(max_rows): | |
| csv_writer.writerow([gen_digits(max_digits)]) | |
| max_rows = 100 | |
| filename = f'/tmp/produtos_{max_rows}.csv' | |
| max_digits = 72 | |
| tic = timeit.default_timer() | |
| write_csv(filename, max_rows, max_digits) | |
| toc = timeit.default_timer() | |
| print(round(toc - tic, 2), 'segundos') | |
| # 1977.56 segundos # para 14000605 | |
| print(round((toc - tic)/60, 2), 'minutos') | |
| # 32.96 minutos # para 14000605 |
Agradeço a @juliano777 pela ajuda.
https://github.com/juliano777/pgsql_fs2w