Ir para conteúdo
Fórum Script Brasil
  • 0

Ajuda com Banco de Dados


Victor Santos Silva

Pergunta

Boa galera, venho aqui pedir a ajuda de vocês. Bom, estou iniciando um estudo de banco de dados com python, eu acompanho um livro. Daí eu consegui fazer alguns exemplos fáceis, com o livro e ajuda de video aula. No entanto estou tentando fazer um programa com o qual é possível inserir valores em uma tabela. O erro ocorre numa função inicial. Segue o código abaixo:

# -*- coding: utf-8 -*-
import sqlite3, time
conectar = sqlite3.connect('teste.db')
c = conectar.cursor()
def criar_db():
c.execute('CREATE TABLE IF NOT EXISTS testando(sexo char, nome varchar)')
def inserir(sexo,nome):
c.execute('INSERT INTO teste (sexo, nome) VALUES (?,?)', (sexo, nome))
conectar.commit()
fc = int(input('1- Entrar com valores\n2 - Criar o banco de dados\nO que você deseja fazer?: ')
if fc == 1:
try:
print('Inserir valores')
sexo = str(input('Informe o sexo: ')
nome = str(input('Informe o seu nome: ')
time.sleep(2)
inserir(sexo,nome)
except:
print('Erro ao inserir valores!')
else:
print('Valores inseridos com sucesso!')
elif fc == 2:
try:
criar_db()
except:
print('Erro ao criar banco de dados!')
else:
print('Banco de dados criado com sucesso!')
Perdão pela má formatação. Então, o erro ocorre na linha 8:c.execute('CREATE TABLE IF NOT EXISTS testando(sexo char, nome varchar)')
^
IndentationError: expected an indented block
Acredito que possa haver mais erros, mas como eu não consegui ir adiante, peço a ajuda de vocês para reparar isso. Valeu galera!
Link para o comentário
Compartilhar em outros sites

12 respostass a esta questão

Posts Recomendados

  • 0

Ola Victor.

Poderia usar a ferramenta de postagem de codigo assim teremos o mesmo codigo de partida do seu erro.

Como eu mesmo formatei o seu codigo, não consegui achar o mesmo erro, achei outros, mas não o mesmo

Link para o comentário
Compartilhar em outros sites

  • 0
# -*- coding: utf-8 -*-
import sqlite3, time

conectar = sqlite3.connect('teste.db')
c = conectar.cursor()

def criar_db():
c.execute('CREATE TABLE IF NOT EXISTS testando(sexo char, nome varchar)')

def inserir(sexo,nome):
c.execute('INSERT INTO teste (sexo, nome) VALUES (?,?)', (sexo, nome))
conectar.commit()

fc = int(input('1- Entrar com valores\n2 - Criar o banco de dados\nO que você deseja fazer?: ')
if fc == 1:
	try:
		print('Inserir valores')
		sexo = str(input('Informe o sexo: ')
		nome = str(input('Informe o seu nome: ')
		time.sleep(2)
		inserir(sexo,nome)
	except:
		print('Erro ao inserir valores!')
	else:
		print('Valores inseridos com sucesso!')
elif fc == 2:		
	try: 
		criar_db()
	except:
		print('Erro ao criar banco de dados!')
	else:
		print('Banco de dados criado com sucesso!')	
Link para o comentário
Compartilhar em outros sites

  • 0

Certo amigo Victor.

O primeiro ponto do porque não esta funcionando é a indentação, vamos pegar a primeira função como exemplo:

#sem indentação - errado
def criar_db():
c.execute('CREATE TABLE IF NOT EXISTS testando(sexo char, nome varchar)')

#com indentação - correto
def criar_db():
    c.execute('CREATE TABLE IF NOT EXISTS testando(sexo char, nome varchar)')

O segundo ponto fica com algumas parenteses faltando, segue o exemplo:

nome = str(input('Informe o seu nome: ') # falto uma ) no final desta linha

Estes são os erros em python que vi ate aqui, agora tem os que envolvem o banco de dados

Sendo franco, eu não sei usar banco de dados, então façamos o seguinte, você segue dai e eu daqui e vamos juntos aprender estas paradas

Link para o comentário
Compartilhar em outros sites

  • 0

Boa noite carinha, muito obrigado pela ajuda, valeu mesmo. Eu vi outros erros, de certa forma fiz uma revisão mais atenta. Então, quanto ao banco de dados, o que estou usando é o sqlite3, que já está incluso no python3, bastando apenas importar a biblioteca "sqlite3". Bom, pelo que eu ando lendo, o processo é o mesmo para qualquer banco de dados. Resumidamente os processos são:

Conectar(estabelece uma conexão com seu banco de dados)

- Criar(você necessita criar um cursor para se comunicar através da conexão com os dados)

- Interagir(O uso do cursor permite a manipulação dos dados usando SQL)

- Commit(basicamente salva todas as mudanças, tornando-as permanentes)

- Reverter(como eu não usei ainda, não sei muito sobre, apenas que ele retorna os valores dos dados SQL ao estado anterior, abortando as manipulações)

- Fechar (fecha a conexão com o banco de dados).

Em resumo, depois que você importa sqlite3, precisa se conectar com o banco, daí :

conectar = sqlite3.connect('teste.db')

c = conectar.cursor()

Qualquer ação que for feita, deve ser feita com o cursor, tanto a criação da tabela como a inserção ou remoção de valores:

c.execute('CREATE TABLE IF NOT EXISTS testando(sexo char, nome varchar)')

e

c.execute('INSERT INTO teste (sexo, nome) VALUES (?,?)', (sexo, nome))

a linha: conectar.commit() ; permite que qualquer mudança feita seja salva, sem ele, assim que o programa é fechada, os valores inseridos ou removidos, assim como qualquer mudança no banco de dados, é perdido.

conectar.close() ; encerra a conexão com o banco de dados.

Quanto aos tipos de dados, aqueles nomes que acompanham as colunas (no caso sexo e nome), CHAR: não vejo muita diferença com VARCHAR , além do espaço requirido, e para tamanho fixo é mais usado CHAR. Me desculpe pela confusão, não li muito sobre SQL ainda, então ainda estou testando as coisas.

Fonte: Use a Cabeça Python e Use a Cabeça SQL

Então cara, espero que tenha entendido, ou que de alguma forma tenha sido útil pra alguém. Eu estou estudando banco de dados em python nas minhas horas vagas (que não são muitas, por cursar faculdade em período integral), mas de vagar a coisa vai fluindo. Agradeço a ajuda de todos, falou!

Link para o comentário
Compartilhar em outros sites

  • 0

O erro que eu estava cometendo do banco de dados, esqueci de comentar acima, é da maneira como eu escrevi os comando SQL:

c.execute('CREATE TABLE IF NOT EXISTS testando(sexo char, nome varchar)') ; na verdade necessita de aspas tripla, ficando:

c.execute("""CREATE TABLE IF NOT EXISTS testando(sexo char, nome varchar)""")

^mais uma desatenção.

Link para o comentário
Compartilhar em outros sites

  • 0
# -*- coding: utf-8 -*-
import sqlite3

conectar = sqlite3.connect('teste.db')
c = conectar.cursor()

def criar_db():
	c.execute("""CREATE TABLE IF NOT EXISTS testando(sexo text, nome text)""")

def inserir(sexo,nome):
	c.execute('INSERT INTO teste VALUES(?,?)', (sexo, nome))
	conectar.commit()

fc = int(input('1- Inserir valores no banco de dados\n2 - Criar banco de dados\nO que você deseja fazer?: '))

if fc == 1:
	try:
		print('Inserir valores')
		sexo = str(input('Informe o sexo: '))
		nome = str(input('Informe o seu nome: '))
		inserir(sexo, nome)
	except:
		print('Erro ao inserir valores!')
	else:
		print('Valores inseridos com sucesso!')
elif fc == 2:		
	try: 
		criar_db()
	except:
		print('Erro ao criar banco de dados!')
	else:
		print('Banco de dados criado com sucesso!')	

Então, o problema ainda persiste, não sei se o que eu disse quanto as aspas triplas procede, tendo ciência de que há diferença entre o python2 e o python3, talvez isso responda a esse formalismo diferente. Mas após responder o nome, o programa trava; mudei os tipos de dados para text, achando que pudesse ser o problema, mas até agora nada. Valeu galera, boa noite.

Link para o comentário
Compartilhar em outros sites

  • 0

Ola Victor, como eu disse to contigo nessa, to fazendo as coisas do meu jeitinho para não me perder

import sqlite3

def main():
    while True:
        print("Escolha uma ação")
        ac = int(input('1 - Inserir valores em um banco existente\n2 - Criar um banco de dados\n:'))

        if ac == 1:
            pass

        elif ac == 2:
            pass

        else:
            print('Ação não definida, encerrando aplicação')
            break


#####
#_____
def criarBancoSQL(nome):
    banco = sqlite3.connect('{}.db'.format(nome))
    return banco, banco.cursor()

#____
def criarTabela(cursor, nome, *args):
    cursor.execute('''CREATE TABLE {} {}'''.format(nome, args))

#____
def inserirData(banco, cursor, tabela, *args):
    cursor.execute('''INSERT INTO {} VALUES {}'''.format(tabela, args))
    banco.commit()
        
#####
main()
 

Ainda não testei, fiz seguindo a API do python 3, eu vou estudar a API do site do SQLite3 para fazer os testes.

Eu testei a duvida das aspas, tanto faz aspas triplas ou não, os comando funcionam normalmente

Link para o comentário
Compartilhar em outros sites

  • 0

Aqui vai minha atualização do codigo, na verdade é apenas por para funcionar

import sqlite3

def main():    
    while True:
        print("Escolha uma ação")
        ac = input('1 - Criar um banco de dados\n2 - Inserir valores em um banco existente\n:')

        if ac == '1':
            print('Criando um banco de dados')
            
            try:
                banco, cursor = criarBancoSQL('teste')
                criarTabela(cursor, 'pessoas', 'nome', 'sexo')

            except:
                print('Erro!')

            else:
                print('Banco criado!')
                      

        elif ac == '2':
            try:
                print('Entre valores')
                nome = input('Informe o nome: ')
                sexo = input('Informe o sexo: ')
                inserirData(banco, cursor, 'pessoas', nome, sexo)

            except:
                print('Erro!')

        else:
            cursor.execute('SELECT nome, sexo FROM pessoas')
            print('Ação não definida, encerrando aplicação\nChecagem arbitraria do banco\n', cursor.fetchone())
            break


#####
#_____
def criarBancoSQL(nome):
    banco = sqlite3.connect('{}.db'.format(nome))
    return banco, banco.cursor()


#____
def criarTabela(cursor, nome, *args):
    cursor.execute('''CREATE TABLE {} {}'''.format(nome, args))


#____
def inserirData(banco, cursor, tabela, *args):
    cursor.execute('''INSERT INTO {} VALUES {}'''.format(tabela, args))
    banco.commit()
        


#####
main()

Editado por ArteEN
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...