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