首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > perl python >

Python向sqlite注册回调函数的有关问题

2013-06-26 
Python向sqlite注册回调函数的问题使用python向sqlite注册了一个函数,函数入参预期是一个整型值,遇到长整

Python向sqlite注册回调函数的问题
使用python向sqlite注册了一个函数,函数入参预期是一个整型值,遇到长整型时,发生了溢出,python版本是2.5的,为何会发生长整型溢出呢?

import sqlite3
def testInt(para):
    print "para type is: %s"%type(para)
    print "para value is: %s"%para

con = sqlite3.connect(":memory:")
con.create_function("testInt",1,testInt)
cur = con.cursor()

#执行的sql中使用了python注册给sqlite的函数testInt
cur.execute("select testInt(4294967040)")

#打印结果如下所示,入参是一个长整型,发生了溢出:
para type is: <type 'int'>
para value is: -256

python应该是能够自动转换成长整型的,难道是sqlite调用testInt函数的时候传入的参数值就已经是溢出后的值了?

[解决办法]
import sqlite3
    
con = sqlite3.connect(":memory:")
cur = con.cursor()

# 1.sqlite 是支持64位整数的
cur.execute("select abs(?)", (pow(2,35),))
print(cur.fetchone()[0])
cur.execute("select abs(?)", (pow(2,63)-1,))
print(cur.fetchone()[0])
cur.execute("select abs(?)", ('8098080',)) #可以将string转换成int的
print(cur.fetchone()[0])

# 2.如果大于64位就会出错 (但是为什么他也出错呢?)
#   我想是因为你可以用 “-” 来表示负数 不需要用二进制来表示
cur.execute("select ?", (pow(2,63),))
print(cur.fetchone()[0])  #这一段是会有异常的

cur.execute("select -?", (pow(2,63)-1,)) #你可以这样表示负数
print(cur.fetchone()[0])

# 所以说在python内定义的函数仅支持32位整数 并不是因为sqlite
# 我想是因为python中的_sqlite3.pyd ,他原本可以支持64位的 却选择了32位

# 还有一点就是 : 从sqlite传给python函数的数据类型已经不是python中的数据类型了
#               而是sqlite中的数据类型。sqlite是不支持10000位整数的。

# 如果你非要用sqlite 就应该遵守sqlite的规则

热点排行