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