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

2 投票
3 回答
4285 浏览
提问于 2025-04-17 08:14

我遇到的问题是要确定进入数据库的数据类型。我想大家在Django中都有一个IntegerField模型,而我的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]')

使用的代码是:

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

就像我在你之前的问题中说的,你应该使用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的话,也就不需要去费心 把IP地址转换成整数了。

0

我看到两个主要问题。第一个是 '186.99.41.000' 不是一个整数,而是一个字符串。Django 提供了一个 IP 地址字段,专门用来处理这个。

第二个问题和第一个类似,'09876' 也是一个字符串,而你的列类型是 IntegerField。不过,当你把 '09876' 转换成整数时,你会得到 9876,因为在 Python 中,以 0 开头的数字被当作八进制数:

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

所以你需要把 '09876' 存储为字符串在你的数据库里,为此你需要把列的类型改成 CharField

1

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

所以我觉得我提到的第二种方式应该是可行的。

撰写回答