Python + Mysql =不正确的整数值:

时间:2011-12-12 21:34:25

标签: python mysql django

我遇到的问题是确定进入数据库的数据类型,我认为Django和Python代码中的每个人都是IntegerField模型,只将它们全部插入到一个列表中,然后将其插入到基础数据中。

另一方面,根据行的规则,我没有非常清楚地编写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 个答案:

答案 0 :(得分:1)

我对Django不是很熟悉,但我看到的是你指定的对象' - 认为你不需要这样做。你尝试过类似的东西吗?

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

或者:

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

所以我认为它应该是我提到的第二种方式。

答案 1 :(得分:0)

我看到两个主要问题 - 首先是'186.99.41.000'不是整数,这是一个字符串。 Django提供了专为此设计的ip address field

您的第二个问题与第一个问题类似,因为'09876'是一个字符串,而您的列类型是IntegerField,但是当您将'09876'转换为整数时,您将会获取9876因为在Python中,从0开始的数字是八进制文字:

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

因此,您需要将'09876'作为字符串存储在数据库中,为此,您需要将列类型更改为CharField

答案 2 :(得分:0)

就像我在你的新问题上说的那样,你应该使用Django的模型api来为你处理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也意味着您不需要打扰trying to convert the IP address to an int