Inserindo 14.000.605 registros num banco de dados em

1 segundo

Um dos organizadores do Grupy-SP

Regis Santos

@rg3915

Desafio:

Salvar 300.000 registros de um CSV num banco de dados PostgreSQL.

Framework

ORM

import sqlite3

# conectando...
conn = sqlite3.connect('produtos.db')
# definindo um cursor
cursor = conn.cursor()

# criando a tabela (schema)
cursor.execute("""
CREATE TABLE produtos (
        id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
        produto TEXT NOT NULL
);
""")

print('Tabela criada com sucesso.')
# desconectando...
conn.close()
import sqlite3

conn = sqlite3.connect('produtos.db')
cursor = conn.cursor()

produtos = ['P1', 'P2', 'P3', 'P4', 'P5']

for produto in produtos:
    cursor.execute(f"""
    INSERT INTO produtos (produto) VALUES ('{produto}')
    """)

conn.commit()
conn.close()

clique no código

For NÃO

For é lento

executemany()

import sqlite3

conn = sqlite3.connect('produtos.db')
cursor = conn.cursor()

produtos = ['P1', 'P2', 'P3', 'P4', 'P5']

cursor.executemany(f"""
INSERT INTO produtos (produto) VALUES ('{produto}')
""", produtos)

conn.commit()
conn.close()
import subprocess
import timeit


subprocess.call("comando", shell=True)
# Cria tabela
comando_sql = """CREATE TABLE produtos
                 (id SERIAL PRIMARY KEY,
                 produto VARCHAR(100));"""
comando_psql = f'psql -U postgres -c "{comando_sql}" nome_db'
subprocess.call(comando_psql, shell=True)
# Insere os dados
copy_sql = f"COPY produtos (produto) FROM '{filename}' CSV HEADER;"
copy_psql = f'psql -U postgres -c "{copy_sql}" estoque'
subprocess.call(copy_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)

Live Code

Várias tabelas relacionadas

  • Ler o CSV
  • Separar as categorias
  • Criar um conjunto de categorias (set)
  • Ler as categorias no banco e pegar o id
  • Criar um dicionário das categorias (dict)
  • Ler o CSV dos produtos
    • Ler e gravar o id das categorias
    • Gravar um novo CSV
  • Salvar o novo CSV no banco

dúvidas?

Obrigado!

@rg3915

just-python-2019

By Régis Silva

just-python-2019

Inserindo 14.000.605 registros num banco de dados em 1 segundo.

  • 1,376