Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python sqlite3模块在插入记录时返回错误的rowid值_Python_Sqlite - Fatal编程技术网

Python sqlite3模块在插入记录时返回错误的rowid值

Python sqlite3模块在插入记录时返回错误的rowid值,python,sqlite,Python,Sqlite,Python的sqlite3模块有一个非常奇怪的问题——更奇怪的是,它只发生在一个特定的表中,但它发生在该表的任何数据库中 因此,我在sqlite3数据库中创建了一个表,如下所示: CREATE TABLE BlockedNumbers (MobileNumber integer PRIMARY KEY NOT NULL, BlockedTimes integer); 然后在Python中运行以下命令: import sqlite3 conn = sqlite3.connect('/tmp/t

Python的sqlite3模块有一个非常奇怪的问题——更奇怪的是,它只发生在一个特定的表中,但它发生在该表的任何数据库中

因此,我在sqlite3数据库中创建了一个表,如下所示:

CREATE TABLE BlockedNumbers (MobileNumber integer PRIMARY KEY NOT NULL, BlockedTimes integer);
然后在Python中运行以下命令:

import sqlite3
conn = sqlite3.connect('/tmp/test.db',isolation_level=None, detect_types=sqlite3.PARSE_DECLTYPES);
sqliteobj = conn.cursor()
sqliteobj.execute("INSERT INTO BlockedNumbers (MobileNumber,BlockedTimes) VALUES ('9999999999','1');")
print sqliteobj.lastrowid
根据:

如果表包含INTEGER主键类型的列,则该列将成为ROWID的别名。然后,您可以使用四个不同的名称中的任意一个来访问ROWID,即上面描述的三个原始名称或指定给INTEGER主键列的名称

所以在本例中,我们希望得到一个rowid为99999999,实际上,这正是我运行
select last_insert_rowid()时得到的结果。但在Python中,我得到:

1283723252
或者各种随机数,包括负数。如果创建了这个特定的表,即使使用干净的新数据库也会发生这种情况


这是Python2.6.6,我正在运行它,因为我将它与在其下运行的脚本一起使用。这是虫子吗?我找不到任何关于这种行为的证据

是的,这是Python中的一个bug;看见
sys.maxint
上的任何rowid(例如64位系统上的2147483647)都将溢出:

$ python
Python 2.6.6 (r266:84292, Dec 27 2010, 00:02:40) 
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> import sqlite3
>>> conn = sqlite3.connect(':memory:')
>>> sqliteobj = conn.cursor()
>>> sqliteobj.execute('CREATE TABLE BlockedNumbers (MobileNumber integer PRIMARY KEY NOT NULL, BlockedTimes integer);')
<sqlite3.Cursor object at 0xb73fb7a0>
>>> sqliteobj.execute("INSERT INTO BlockedNumbers (MobileNumber,BlockedTimes) VALUES (?, '1')", (sys.maxint,))
<sqlite3.Cursor object at 0xb73fb7a0>
>>> sqliteobj.lastrowid
2147483647
>>> sqliteobj.execute("INSERT INTO BlockedNumbers (MobileNumber,BlockedTimes) VALUES (?, '1')", (sys.maxint + 1,))
<sqlite3.Cursor object at 0xb73fb7a0>
>>> sqliteobj.lastrowid
-2147483648
$python
Python 2.6.6(r266:842921010年12月27日00:02:40)
[GCC 4.4.5]关于linux2
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>>导入系统
>>>导入sqlite3
>>>conn=sqlite3.connect(“:内存:”)
>>>sqliteobj=conn.cursor()
>>>execute('CREATE TABLE BlockedNumbers(MobileNumber integer主键不为NULL,BlockedTimes integer);'))
>>>execute(“插入到BlockedNumber(MobileEnumber,BlockedTime)值(?,1'),(sys.maxint,))
>>>sqliteobj.lastrowid
2147483647
>>>execute(“插入到BlockedNumber(MobileEnumber,BlockedTime)值(?'1'),(sys.maxint+1,))
>>>sqliteobj.lastrowid
-2147483648
Python版本2.6.9、2.7.4、3.2.4和3.3.1都包含对该错误的修复