Python 将变量传递给函数时出现溢出错误
Python Overflow Error when passing variables to function
我有一个查询从数据库中获取任意数量的行,但通常不超过两行。
我用
调用查询
ret = self.workaround.delete_last_version(pdf_file, self.cust_id, self.part_id)
如果我对值进行硬编码并将它们输入到查询中,它工作正常,但是当我 运行 整个程序正常,并通过 gui 输入数据时,我得到查询函数是叫
OverflowError: long too big to convert
但是,在调用之前,我使用 str()
将 part_id 和 cust_id 转换为字符串
这是我一直在测试的值。
part_id = "168440901713431956015724879141"
cust_id = "15424322074155018763160235136213"
pdf_file = "1971-48.pdf"
cust_id是32个字符长,part_id是30
这是查询。
query = """
SELECT Id, Name, DocDateStamp, Dir_Id
FROM SdmDocumentList
WHERE Owner_Id = ? AND Name = ?
ORDER BY DocDateStamp desc
"""
self.cursor.execute(query, (part_id, pdf_file))
result = self.cursor.fetchall()
并且游标定义在__init__
def __init__(self):
self.conn =pyodbc.connect('DRIVER=SQL Server;SERVER=mssql;PORT=CORRECTPORT;DATABASE=DATABASENAME;UID=USER;PWD=SUPERSECRETPASSWORD;TDS_Version=8.0;Trusted_Connection=no') #windows
self.cursor = self.conn.cursor()
我从命令行调用函数时得到的预期输出
[('70D8B606A5BD421F97467F2C8D1D8F04', '1971-48.pdf', datetime.datetime(2017, 5, 12, 9, 28, 58, 743333), 9),
('F049665629814B83B63B0536F985090B', '1971-48.pdf', datetime.datetime(2017, 5, 12, 9, 28, 22, 86666), 9),
('39EAB6B173B745E19BA8A0598AD8F015', '1971-48.pdf', datetime.datetime(2017, 5, 12, 9, 27, 58, 933333), 9),
('6309915CEA504839A8D7340F9A4FD601', '1971-48.pdf', datetime.datetime(2017, 5, 12, 9, 12, 26, 36666), 9),
('5D3E3AA218CA4FF59E8EC2DE2A6AB217', '1971-48.pdf', datetime.datetime(2017, 5, 12, 9, 11, 37, 760000), 9),
('1C2AC1073E754A41A998DF99BD0F4F48', '1971-48.pdf', datetime.datetime(2017, 5, 12, 9, 10, 49, 986666), 9),
('05EF8020EA354E669D1D930650FBCB02', '1971-48.pdf', datetime.datetime(2017, 5, 12, 8, 54, 59, 80000), 9),
('834979EFB639466ABC73E76F88DF6750', '1971-48.pdf', datetime.datetime(2017, 5, 12, 8, 54, 5, 46666), 9),
('F3EF2C75856E4926A52204EBA59072CB', '1971-48.pdf', datetime.datetime(2017, 5, 12, 8, 50, 38, 406666), 9),
('6F7FC2652E114162AF6B3C4C30818582', '1971-48.pdf', datetime.datetime(2017, 5, 12, 8, 37, 59, 610000), 9)]
我 运行宁 Python2.7 在 Windows7 64 位和 6GB RAM 上,使用 mssql
我用 Google 搜索并查看了 OverflowErrors 和 longs 太长而无法转换的其他问题,但是 none 发布的解决方案似乎解决了我的问题,我在互联网上发现的所有问题都有long 被转换为另一种数字类型。在我收到错误的那一行,我什至没有尝试转换任何东西,只是将变量传递给函数。
在 Python 中可以向函数发送多少数据是否存在内存限制,或者我是否完全遗漏了其他内容?
非常乐意在需要时提供更多信息,但我想我已经写下了为此需要的所有信息。
提前感谢您的帮助
编辑更新 pyodbc 后失败的查询:
更新 pyodbc 后导致问题的新查询
Dir_Id = 9 # Manufactering Data folder (from SdmDirSructure)
DocumentType_RecNo = 3 # PDF
OwnerType_RecNo = 2 # parent_id for Product (from SdmDirSructure)
FromTo = 14872094126171117726173141183125 # CNCDrill user ID
DocumentSubject_RecNo = 109 # Xcheck data (from SdmDocumentSubjects)
Owner_Id = self.part_id # It is the part id
DocDateStamp = file_datetime # datetime of the document
RegisteredDate = file_datetime # when the document was added to the doc manager
LastReadDate = file_datetime # date that the document last readed (set as the RegisteredDate)
ArchiveLocation_RecNo = 0 # Not in use
IsReceived = True # Not in use
IsArchived = False # Not in use
IsOwnedByUser = 0 # No-one ownes the file
query = """
INSERT INTO SdmDocumentList (Id, Name, Dir_Id, DocumentType_RecNo, OwnerType_RecNo, FromTo, DocumentSubject_RecNo, Owner_Id, DocDateStamp, RegisteredDate, LastReadDate, ArchiveLocation_RecNo, IsReceived, IsArchived, IsOwnedByUser, IsClassified)
VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
"""
self.cursor.execute(query, (uid,pdf_file, Dir_Id, DocumentType_RecNo, OwnerType_RecNo, FromTo, DocumentSubject_RecNo,Owner_Id, DocDateStamp, RegisteredDate, LastReadDate, ArchiveLocation_RecNo, IsReceived, IsArchived, IsOwnedByUser, IsClassified))
self.cursor.commit()
FromTo = 14872094126171117726173141183125 # CNCDrill user ID
圣杯。最终我开始打印每个变量及其类型。事实证明,在我硬编码 'FromTo' 变量的地方,这个脚本永远不会改变,我忘记在它周围加上 " ",使它变长,这导致崩溃查询。
我意识到当我在脚本的前面从数据库中获取零件和客户 ID 时,它以 Unicode 的形式返回它们。我对 Unicode 做了一些研究,并尝试了替代方案,例如在脚本顶部定义编码,但它们没有用。然而,这让我走上了正确的道路,检查每个变量是否是我期望的类型。
感谢周五的所有帮助,@Gord Thompson May
我有一个查询从数据库中获取任意数量的行,但通常不超过两行。
我用
调用查询ret = self.workaround.delete_last_version(pdf_file, self.cust_id, self.part_id)
如果我对值进行硬编码并将它们输入到查询中,它工作正常,但是当我 运行 整个程序正常,并通过 gui 输入数据时,我得到查询函数是叫
OverflowError: long too big to convert
但是,在调用之前,我使用 str()
将 part_id 和 cust_id 转换为字符串这是我一直在测试的值。
part_id = "168440901713431956015724879141"
cust_id = "15424322074155018763160235136213"
pdf_file = "1971-48.pdf"
cust_id是32个字符长,part_id是30
这是查询。
query = """
SELECT Id, Name, DocDateStamp, Dir_Id
FROM SdmDocumentList
WHERE Owner_Id = ? AND Name = ?
ORDER BY DocDateStamp desc
"""
self.cursor.execute(query, (part_id, pdf_file))
result = self.cursor.fetchall()
并且游标定义在__init__
def __init__(self):
self.conn =pyodbc.connect('DRIVER=SQL Server;SERVER=mssql;PORT=CORRECTPORT;DATABASE=DATABASENAME;UID=USER;PWD=SUPERSECRETPASSWORD;TDS_Version=8.0;Trusted_Connection=no') #windows
self.cursor = self.conn.cursor()
我从命令行调用函数时得到的预期输出
[('70D8B606A5BD421F97467F2C8D1D8F04', '1971-48.pdf', datetime.datetime(2017, 5, 12, 9, 28, 58, 743333), 9),
('F049665629814B83B63B0536F985090B', '1971-48.pdf', datetime.datetime(2017, 5, 12, 9, 28, 22, 86666), 9),
('39EAB6B173B745E19BA8A0598AD8F015', '1971-48.pdf', datetime.datetime(2017, 5, 12, 9, 27, 58, 933333), 9),
('6309915CEA504839A8D7340F9A4FD601', '1971-48.pdf', datetime.datetime(2017, 5, 12, 9, 12, 26, 36666), 9),
('5D3E3AA218CA4FF59E8EC2DE2A6AB217', '1971-48.pdf', datetime.datetime(2017, 5, 12, 9, 11, 37, 760000), 9),
('1C2AC1073E754A41A998DF99BD0F4F48', '1971-48.pdf', datetime.datetime(2017, 5, 12, 9, 10, 49, 986666), 9),
('05EF8020EA354E669D1D930650FBCB02', '1971-48.pdf', datetime.datetime(2017, 5, 12, 8, 54, 59, 80000), 9),
('834979EFB639466ABC73E76F88DF6750', '1971-48.pdf', datetime.datetime(2017, 5, 12, 8, 54, 5, 46666), 9),
('F3EF2C75856E4926A52204EBA59072CB', '1971-48.pdf', datetime.datetime(2017, 5, 12, 8, 50, 38, 406666), 9),
('6F7FC2652E114162AF6B3C4C30818582', '1971-48.pdf', datetime.datetime(2017, 5, 12, 8, 37, 59, 610000), 9)]
我 运行宁 Python2.7 在 Windows7 64 位和 6GB RAM 上,使用 mssql
我用 Google 搜索并查看了 OverflowErrors 和 longs 太长而无法转换的其他问题,但是 none 发布的解决方案似乎解决了我的问题,我在互联网上发现的所有问题都有long 被转换为另一种数字类型。在我收到错误的那一行,我什至没有尝试转换任何东西,只是将变量传递给函数。
在 Python 中可以向函数发送多少数据是否存在内存限制,或者我是否完全遗漏了其他内容?
非常乐意在需要时提供更多信息,但我想我已经写下了为此需要的所有信息。
提前感谢您的帮助
编辑更新 pyodbc 后失败的查询:
更新 pyodbc 后导致问题的新查询
Dir_Id = 9 # Manufactering Data folder (from SdmDirSructure)
DocumentType_RecNo = 3 # PDF
OwnerType_RecNo = 2 # parent_id for Product (from SdmDirSructure)
FromTo = 14872094126171117726173141183125 # CNCDrill user ID
DocumentSubject_RecNo = 109 # Xcheck data (from SdmDocumentSubjects)
Owner_Id = self.part_id # It is the part id
DocDateStamp = file_datetime # datetime of the document
RegisteredDate = file_datetime # when the document was added to the doc manager
LastReadDate = file_datetime # date that the document last readed (set as the RegisteredDate)
ArchiveLocation_RecNo = 0 # Not in use
IsReceived = True # Not in use
IsArchived = False # Not in use
IsOwnedByUser = 0 # No-one ownes the file
query = """
INSERT INTO SdmDocumentList (Id, Name, Dir_Id, DocumentType_RecNo, OwnerType_RecNo, FromTo, DocumentSubject_RecNo, Owner_Id, DocDateStamp, RegisteredDate, LastReadDate, ArchiveLocation_RecNo, IsReceived, IsArchived, IsOwnedByUser, IsClassified)
VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
"""
self.cursor.execute(query, (uid,pdf_file, Dir_Id, DocumentType_RecNo, OwnerType_RecNo, FromTo, DocumentSubject_RecNo,Owner_Id, DocDateStamp, RegisteredDate, LastReadDate, ArchiveLocation_RecNo, IsReceived, IsArchived, IsOwnedByUser, IsClassified))
self.cursor.commit()
FromTo = 14872094126171117726173141183125 # CNCDrill user ID
圣杯。最终我开始打印每个变量及其类型。事实证明,在我硬编码 'FromTo' 变量的地方,这个脚本永远不会改变,我忘记在它周围加上 " ",使它变长,这导致崩溃查询。
我意识到当我在脚本的前面从数据库中获取零件和客户 ID 时,它以 Unicode 的形式返回它们。我对 Unicode 做了一些研究,并尝试了替代方案,例如在脚本顶部定义编码,但它们没有用。然而,这让我走上了正确的道路,检查每个变量是否是我期望的类型。
感谢周五的所有帮助,@Gord Thompson May