Jump to content

Erro que não percebo


Xixas
 Share

Recommended Posts

Olá tenho este código e não percebo porque esta a dar erro. Tenho tudo testado ate ao ultimo sql e penso que seja ai. mas nao tenho a certeza.

obrigada

nome = raw_input("Qual e o nome?")

sql = "select * from Customers where cname = '" + nome + "'"  

cursor = dbcn.cursor()
cursor.execute(sql)

nitems = int(cursor.rowcount)

if nitems != 0:
   row = cursor.fetchone()
   print "O nome", row[1], "já existe!\nO seu número de cliente é", row[0], "!"

else:
   print "Este nome de cliente não existe! Introduza os seguintes dados:"
   dNasc = raw_input("Qual e a data de nascimento?")
   cidade = raw_input("Qual e a cidade?")
   sql = "select * from Customers"
   cursor = dbcn.cursor()
   cursor.execute(sql2)
   numNovo = int(cursor.rowcount)+1
   sql2 = "insert into Customers \
           (CID, cname, birthyear, city) \
           VALUES (" + str(ntc) + ", '" + nome + "', " + str(dNasc) + ", " + str(cidade) + ")
   cursor2 = dbcn.cursor()
   cursor2.execute(sql2)
   dbcn.commit()
Edited by thoga31
Tags code + GeSHi
Link to comment
Share on other sites

obrigada(ainda n percebo muito disto)

entretanto ja alterei mas continua a dar erro nisto

Traceback (most recent call last):
 File "U:\IBD\Trab5b).py", line 35, in <module>
   cursor2.execute(sql2)
 File "C:\Python27\lib\site-packages\MySQLdb\cursors.py", line 195, in execute
   self.errorhandler(self, TypeError, m)
 File "C:\Python27\lib\site-packages\MySQLdb\connections.py", line 36, in defaulterrorhandler
   raise errorclass, errorvalue
TypeError: must be string or read-only buffer, not tuple

>> novo codigo (excerto)

else:
   print "Este nome de cliente não existe! Introduza os seguintes dados:"
   dNasc = raw_input("Qual e a data de nascimento?")
   cidade = raw_input("Qual e a cidade?")
   sql = "select * from Customers"
   cursor = dbcn.cursor()
   cursor.execute(sql)
   numNovo = int(cursor.rowcount)+1
   sql2 = "INSERT INTO Customers VALUES (",numNovo,", '",nome,"', ",dNasc,", ",cidade,")"
   cursor2 = dbcn.cursor()
   cursor2.execute(sql2)
   dbcn.commit()
Edited by thoga31
Tags code + GeSHi
Link to comment
Share on other sites

Traceback (most recent call last):
 File "U:\IBD\Trab5b).py", line 35, in <module>
   cursor2.execute(sql2)
 File "C:\Python27\lib\site-packages\MySQLdb\cursors.py", line 195, in execute
   self.errorhandler(self, TypeError, m)
 ...
TypeError: must be string or read-only buffer, not tuple

O interpretador diz-te tudo o que precisas de saber: na linha 35 do teu ficheiro Trab5b).py há um erro, mais precisamente no argumento que passas à função execute(): o tipo de dados de sql2 deverá ser string e não um tuplo.

Relativamente aos tuplos, a documentação diz-nos o seguinte:

Tuples are constructed by the comma operator (not within square brackets), with or without enclosing parentheses (...)

E vejamos agora como definiste sql2:

sql2 = "INSERT INTO Customers VALUES (",numNovo,", '",nome,"', ",dNasc,", ",cidade,")"

Parece-me claro que sql2 encaixa na regra que mencionei e é de facto um tuplo, pois pegaste em meia dúzia de strings e utilizaste a vírgula entre elas sem parêntesis rectos ou curvos.

Para resolveres o teu problema, deverás concatenar as strings correctamente:

sql2 = "INSERT INTO Customers VALUES (" + numNovo + ", '" + nome + "', " + dNasc + ", " + cidade + ")"

ou então, utilizando a format():

sql2 = "INSERT INTO Customers VALUES ({}, '{}', {}, {})".format(numNovo, nome, dNasc, cidade)
Edited by pwseo
  • Vote 1
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.