Django Forms pyodbc Mssql TypeError:在字符串格式化过程中并非所有参数都已转换
我正在SQL server 2014上与现有windows应用一起开发一个web应用。使用以下设置Django Forms pyodbc Mssql TypeError:在字符串格式化过程中并非所有参数都已转换,django,pyodbc,Django,Pyodbc,我正在SQL server 2014上与现有windows应用一起开发一个web应用。使用以下设置 DATABASES = { 'default': { 'NAME': ' Name', 'ENGINE': 'sql_server.pyodbc', 'SERVER': 'server', 'USER': 'sa', 'PASSWORD': 'password', 'OPTIONS': { 'driver_supports_ut
DATABASES = {
'default': {
'NAME': ' Name',
'ENGINE': 'sql_server.pyodbc',
'SERVER': 'server',
'USER': 'sa',
'PASSWORD': 'password',
'OPTIONS':
{
'driver_supports_utf8': True,
'autocommit': True,
'unicode_results': True,
'host_is_server':True,
'driver': 'SQL Server Native Client 11.0',
}
}
}
我在django应用程序中使用存储过程来使用现有功能
class Viewpatform(forms.Form):
Name = forms.CharField(max_length=100)
Phone_Number = forms.IntegerField(label='Phone Number', required=True)
Sex = forms.ChoiceField(widget=forms.Select(choices=sexchoice))
Age = forms.IntegerField(label='Age')
AgeType = forms.ChoiceField(choices=Agetype, required=True, label='Type')
Address = forms.CharField(max_length=500, required=False)
Registration_Date = forms.DateField( label='Registration Date')
with connection.cursor() as cursor:
cursor.execute(''' EXEC dbo.insert_patients @Name = ?, -- varchar(100)
@Phone_Number = ?, -- int
@Age = ?, -- int
@AgeType = ?, -- int
@Address = ?, -- varchar(200)
@sex = ? -- varchar(2)
''', [ Name, Phone_Number, Sex, Age, AgeType, Address] )
我在执行表单时遇到以下错误
文件“c:\python35\lib\site packages\django\db\backends\utils.py”,执行中的第79行
返回super(CursorDebugWrapper,self).execute(sql,params)
文件“c:\python35\lib\site packages\django\db\backends\utils.py”,第64行,执行
返回self.cursor.execute(sql,params)
文件“c:\python35\lib\site packages\sql\u server\pyodbc\base.py”,第535行,执行
sql=self.format\u sql(sql,参数)
文件“c:\python35\lib\site packages\sql\u server\pyodbc\base.py”,第503行,格式为\u sql
sql=sql%元组('?'*len(参数))
TypeError:在字符串格式化过程中并非所有参数都已转换
Django 1.10版
Windows 7 64位
Django Pyodbc azure:版本:1.10.4.0
Python3.5您的参数似乎有问题。必须按照与问号占位符相同的顺序传递参数列表中的参数:
cursor.execute(
'''
EXEC dbo.insert_patients
@Name = ?, -- varchar(100)
@Phone_Number = ?, -- int
@Age = ?, -- int
@AgeType = ?, -- int
@Address = ?, -- varchar(200)
@sex = ? -- varchar(2)
''',
[Name, Phone_Number, Age, AgeType, Address, Sex]
)
得到错误是因为您将整数作为字符串传递,字符串作为整数传递,AFAIK。祝你好运 您的论点似乎有问题。必须按照与问号占位符相同的顺序传递参数列表中的参数:
cursor.execute(
'''
EXEC dbo.insert_patients
@Name = ?, -- varchar(100)
@Phone_Number = ?, -- int
@Age = ?, -- int
@AgeType = ?, -- int
@Address = ?, -- varchar(200)
@sex = ? -- varchar(2)
''',
[Name, Phone_Number, Age, AgeType, Address, Sex]
)
得到错误是因为您将整数作为字符串传递,字符串作为整数传递,AFAIK。祝你好运 首先,为什么要为这样的简单插入编写存储过程?你所做的只是把事情弄得相当复杂。在django中通常不使用游标,因为我们有一个很棒的ORM。基于光标的插入是一个使用Django的单行程序ORM@e4c5我正在使用所有现有的存储过程,我不想根据新的应用程序重新组织我的模型,现有的web应用程序正在生产中,正在进行增强,我也可以通过使用SPSS来涵盖它们,为简单的插入编写存储过程有什么意义?调用存储过程的代码比ORM插入的一行代码复杂。很抱歉,您弄错了。@e4c5 Insert SP影响大约5个表,其中SP内有许多检查,与重写代码相比,我发现只运行已经投入生产的SP更容易。在这种情况下,这意味着您没有提出一个正确的问题。为什么您首先要为这样的简单插入编写存储过程?你所做的只是把事情弄得相当复杂。在django中通常不使用游标,因为我们有一个很棒的ORM。基于光标的插入是一个使用Django的单行程序ORM@e4c5我正在使用所有现有的存储过程,我不想根据新的应用程序重新组织我的模型,现有的web应用程序正在生产中,正在进行增强,我也可以通过使用SPSS来涵盖它们,为简单的插入编写存储过程有什么意义?调用存储过程的代码比ORM插入的一行代码复杂。很抱歉,您弄错了。@e4c5 Insert SP会影响大约5个表,并在SP中执行许多检查,而不是重写代码。我发现只运行已经在生产中的SP更容易。在这种情况下,这意味着您没有开始问正确的问题。