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