Python + Mysql = Неверное целочисленное значение: - PullRequest
2 голосов
/ 13 декабря 2011

Проблема, с которой я столкнулся, заключается в том, чтобы определить тип данных, поступающих в базу данных. Я думаю, что каждый в качестве модели IntegerField в коде Django и Python вставляет все данные в один список, а затем вставляет их в базовые данные.

С другой стороны, я не очень четко пишу длину кода Python в соответствии с правилами строки, я просто вижу, что в конце код очень длинный, разделенный пробелами для выравнивания следующей строки, не знаюесли это хорошо, и код не потерпит неудачу.

Данные, которые должны быть введены в ip_unidad, ('186 .99.41.000', 3333) найдены в 'self.addr [0]' идата данных '091211', которая находится в 'self.Cadenapura [17]'

и попробуйте "self.Cadenapura [17] = int (self.Cadenapura [17])", но ничего

Записывает входные данные в базу данных, но два пробела равны 0.

любые идеи будут благодарны.


Ошибка консоли:

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]')

Код.Используется Py:

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, использованная для создания базы данных:

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

Спасибо.

Ответы [ 3 ]

1 голос
/ 13 декабря 2011

Я не очень знаком с Django, но я вижу, что вы указываете объект внутри '- думаю, вам не нужно это делать.Вы пробовали что-то вроде:

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

Или:

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

При просмотре я нашел следующий пример кода MySQLdb:

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 )
      ] )

Так что я думаю, что это должно работать вторым способом, который я упомянул.

0 голосов
/ 11 марта 2012

Как я уже говорил в вашем новом вопросе, вы должны использовать модель API Django для обработки SQL для вас.

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

Кроме того, вы должны также пересмотреть свою модель. Вместо использования IntegerFields, вы должны вместо этого использовать

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

Затем при сохранении данных (с помощью модели objects.create) вам необходимо убедиться, что ваша дата является объектом python datetime.date . Использование IPAddressField также означает, что вам не нужно беспокоиться , пытаясь преобразовать IP-адрес в int .

0 голосов
/ 14 декабря 2011

Я вижу две основные проблемы - во-первых, '186.99.41.000' не является целым числом, это строка.Django предоставляет поле ip address , предназначенное для этого.

Ваша вторая проблема аналогична первой, в которой '09876' является строкой, а тип столбца IntegerFieldОднако, если вы преобразуете '09876' в целое число, вы получите 9876, потому что в Python число, начинающееся с 0, является восьмеричным литералом:

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

Так что вам нужно сохранить '09876'в виде строки в вашей базе данных, и для этого вам нужно изменить тип столбца на CharField.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...