我正在python中开发一个应用程序。我正在把一些财务数据插入数据库。我有大约1300张表格,所有表格都有相同的模式,每家公司一张表格。
我正在使用pypyodbc 1.3.3(最新)。
我的数据类型是Decimal。我使用的精度为十进制(8,2)。在我的表中,数据类型为DATE、DECIMAL、TINYINT和INT。我将在python程序中的一个表中插入以下行。
['05-JAN-2015', Decimal('30.90'), Decimal('31.40'), Decimal('30.40'), Decimal('30.85'), None, Decimal('0.00'), Decimal('0.00'), None, Decimal('0.00'), Decimal('0.00'), None, Decimal('0.00'), Decimal('0.00'), None, None, Decimal('30.88'), Decimal('0.00'), Decimal('0.00'), Decimal('0.00'), Decimal('0.00'), 32024, 321, Decimal('0.00'), Decimal('0.00'), None, Decimal('0.00'), None, Decimal('0.00')]
05-JAN-2015
的数据类型为DATE,所有None
的数据类型均为TINYINT,值32024, 321
的数据类型则为INT。但我仍然得到了作为的SQL异常
File "C:Python27libsite-packagespypyodbc.py", line 1470, in execute
self._BindParams(param_types)
File "C:Python27libsite-packagespypyodbc.py", line 1433, in _BindParams
check_success(self, ret)
File "C:Python27libsite-packagespypyodbc.py", line 986, in check_success
ctrl_err(SQL_HANDLE_STMT, ODBC_obj.stmt_h, ret, ODBC_obj.ansi)
File "C:Python27libsite-packagespypyodbc.py", line 964, in ctrl_err
raise Error(state,err_text)
Error: (u'HY104', u'[HY104] [Microsoft][SQL Server Native Client 10.0]Invalid precision or scale value')
当我尝试从management studio将相同的数据直接插入SQL server时,它成功插入。我已经交叉检查了变量的数据类型,所有的都是完美的。
当我在一个有点像的循环中将数据插入到大约1300个表中时
for i in range(tables_number):
insertion_data = calculate_values()
insert_into_db(insertion_data)
,这会造成问题吗?我也尝试过在循环中使用0.1秒的延迟。
有人知道吗?这是驱动程序中的错误吗?或者还有其他原因让我失踪吗?
更新:
调试代码后,我在脚本pypyodbc.py
中发现,函数SQLBindParameter(<many parameters>)
返回-1
,它是SQL_ERROR
,参数Decimal('0.00') or Decimal(0.12) or Decimal(-0.12)
表示形式0.*
的小数
这似乎是pypyodbc中的一个bug。这段代码使用pypyodbc 1.3.3,正如您所描述的那样失败了。。。
from decimal import *
import pypyodbc
connStr = "DSN=myDb_SQLEXPRESS;"
cnxn = pypyodbc.connect(connStr, autocommit=True)
crsr = cnxn.cursor()
sql = "INSERT INTO Invoices (InvoiceAmount) VALUES (?)"
invamt = Decimal('0.01')
crsr.execute(sql, [invamt])
crsr.close()
cnxn.close()
但使用pyodbc做完全相同的事情效果良好:
from decimal import *
import pyodbc
connStr = "DSN=myDb_SQLEXPRESS;"
cnxn = pyodbc.connect(connStr, autocommit=True)
crsr = cnxn.cursor()
sql = "INSERT INTO Invoices (InvoiceAmount) VALUES (?)"
invamt = Decimal('0.01')
crsr.execute(sql, [invamt])
crsr.close()
cnxn.close()
此外,如果我在MySQL数据库中对相同的表运行pypyodbc版本。。。
from decimal import *
import pypyodbc
connStr = "DSN=usbMySQL;"
cnxn = pypyodbc.connect(connStr, autocommit=True)
crsr = cnxn.cursor()
sql = "INSERT INTO Invoices (InvoiceAmount) VALUES (?)"
invamt = Decimal('0.01')
crsr.execute(sql, [invamt])
crsr.close()
cnxn.close()
插入数据库的值是0.10
而不是0.01
。