Python + Mysql = 不正确的整数值:
我遇到的问题是要确定进入数据库的数据类型。我想大家在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 个回答
就像我在你之前的问题中说的,你应该使用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地址转换成整数了。
我看到两个主要问题。第一个是 '186.99.41.000'
不是一个整数,而是一个字符串。Django 提供了一个 IP 地址字段,专门用来处理这个。
第二个问题和第一个类似,'09876'
也是一个字符串,而你的列类型是 IntegerField
。不过,当你把 '09876'
转换成整数时,你会得到 9876
,因为在 Python 中,以 0 开头的数字被当作八进制数:
>>> print 127
127
>>> print 0177
127
>>> print 0x7f
127
所以你需要把 '09876'
存储为字符串在你的数据库里,为此你需要把列的类型改成 CharField
。
我对Django不是很熟悉,但我看到你在'中指定了对象——我觉得你不需要这样做。你有没有试过类似下面的写法:
cursor.execute(sql % (self.addr[0], self.Cadenapura[17]))
或者:
cursor.execute(sql, (self.addr[0], self.Cadenapura[17],))
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 )
] )
所以我觉得我提到的第二种方式应该是可行的。