user987055
user987055

Reputation: 1149

Python + Mysql = Incorrect integer value:

The problem I have is to identify the type of data entering the database, I think everyone as IntegerField model in Django and Python code only inserts it all in one list and then insert it into the base data.

On the other hand I have no very clear writing Python code length according to the rules of the line, what I do is just see that in the end the code is very long as separated with spaces to align the next line below do not know if this good in this way and that the code will not fail.

The data that has to enter ip_unidad is ('186 .99.41.000 ', 3333) found in' self.addr [0] 'and the data date is '091211' which is in 'self.Cadenapura [17] '

and try "self.Cadenapura [17] = int (self.Cadenapura [17])" but nothing

It records the input data in the database but the two spaces are 0.

any ideas would be grateful.


The console error is:

Warning: Incorrect integer value: 'self.addr[0]' for column 'ip_unidad' at row 1
  ('self.addr[0]','self.Cadenapura[17]')
Warning:Incorrect integer value: 'self.Cadenapura[17]' for column 'fecha' at row 1
  ('self.addr[0]','self.Cadenapura[17]')

The code. Py used is:

sql = """INSERT INTO carro ( ip_unidad , hora ) VALUES (%s,%s)"""

db = MySQLdb.Connect(host="localhost", user="root",passwd="--------",db="gprslmgs")
cursor = db.cursor()

try :
    cursor.execute(sql,('self.addr[0]','self.Cadenapura[17]'))
    db.commit()
except:
    db.rollback()

Django model used to create the database is:

class Carro(models.Model):
    ip_unidad = models.IntegerField(max_length=15)
    fecha = models.IntegerField(max_length=6)

Thank you.

Upvotes: 2

Views: 4309

Answers (3)

forivall
forivall

Reputation: 9891

Like I said on your newer question, you should use Django's model api to handle the SQL for you.

Carro.objects.create(ip_unidad=self.addr[0], fecha=self.Cadenapura[17])

Furthermore, you should also revise your model. Instead of using IntegerFields, you should instead use

class Carro(models.Model):
    ip_unidad = models.IPAddressField()
    fecha = models.DateField()

Then when saving your data(with the model's objects.create), you need to make sure that your date is a python datetime.date object. Using the IPAddressField also means that you don't need to bother trying to convert the IP address to an int.

Upvotes: 0

Burhan Khalid
Burhan Khalid

Reputation: 174624

I see two main problems - first is that '186.99.41.000' is not an integer, this is a string. Django provides an ip address field which is designed for this.

Your second problem is similar to the first, in that '09876' is a string, and your column type is IntegerField, however when you convert '09876' to an integer, you'll get 9876 because in Python, a number starting from 0 is an octal literal:

>>> print 127
127
>>> print 0177
127
>>> print 0x7f
127

So you need to store '09876' as a string in your database, and to do that you need to change your column type to CharField.

Upvotes: 0

Artsiom Rudzenka
Artsiom Rudzenka

Reputation: 29103

I am not very familiar with Django but what i see is that you specify object within ' - think you don't need to do this. Have you tried something like:

cursor.execute(sql % (self.addr[0], self.Cadenapura[17]))

Or:

cursor.execute(sql, (self.addr[0], self.Cadenapura[17],))

While browsing i found the following MySQLdb sample code:

import MySQLdb

db = MySQLdb.connect(passwd="moonpie",db="thangs")

c = db.cursor()
c.executemany(
      """INSERT INTO breakfast (name, spam, eggs, sausage, price)
      VALUES (%s, %s, %s, %s, %s)""",
      [
      ("Spam and Sausage Lover's Plate", 5, 1, 8, 7.95 ),
      ("Not So Much Spam Plate", 3, 2, 0, 3.95 ),
      ("Don't Wany ANY SPAM! Plate", 0, 4, 3, 5.95 )
      ] )

So i think it should work the second way i mentioned.

Upvotes: 1

Related Questions