Opened 18 years ago
Closed 17 years ago
#3702 closed (invalid)
ado_mssql Introspection module
Reported by: | Owned by: | nobody | |
---|---|---|---|
Component: | Database layer (models, ORM) | Version: | dev |
Severity: | Keywords: | ado_mssql mssql | |
Cc: | Triage Stage: | Unreviewed | |
Has patch: | yes | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
Attached is a patch for the introspection section of ado_mssql. It was currently not implemented, which makes syncdb not work.
There's a rather ugly hack in it due to the fact that adodbapi returns an Error of "None" if no result is returned sometime. I shall try and report this to the adodbapi maintainer.
This has not been tested extensively. I can't find decent documentation for the module's supposed internals, or a test suite. It correctly introspects a bunch of my databases, but if there's an appropriate test module around, I'd like to run it on there first.
Attachments (1)
Change History (5)
by , 18 years ago
Attachment: | adodbintrospection.patch added |
---|
comment:1 by , 18 years ago
moof,
See also ticket #2358 for ongoing work regarding MS SQL Server support enhancements.
comment:3 by , 18 years ago
I just tried to use this today to do some testing on a rather large database with a lot of tables.
I am using Python 2.5.1, Django 0.96 release, adodbapi 2.0.1, and pywin32 build 210 on Windows XP Pro SP2 connecting to SQL Server 2000 SP4 (whew that is a lot of components).
I suspect that the error is not related to Django or this patch, but to the adodbapi or pywin32 components. It appears that it is trying to execute multiple statements inside of a single transaction, which MS SQL server doesn't support.
Here is the output.
# This is an auto-generated Django model module. # You'll have to do the following manually to clean this up: # * Rearrange models' order # * Make sure each model has one field with primary_key=True # Feel free to rename the models, but don't rename db_table values or field names. # # Also note: You'll have to insert the output of 'django-admin.py sqlcustom [appname]' # into your database. from django.db import models class ActionObjectPermissions(models.Model): Traceback (most recent call last): File "manage.py", line 11, in <module> execute_manager(settings) File "c:\python25\Lib\site-packages\django\core\management.py", line 1672, in execute_manager execute_from_command_line(action_mapping, argv) File "c:\python25\Lib\site-packages\django\core\management.py", line 1574, in execute_from_command_line for line in action_mapping[action](): File "c:\python25\Lib\site-packages\django\core\management.py", line 844, in inspectdb relations = introspection_module.get_relations(cursor, table_name) File "c:\python25\lib\site-packages\django\db\backends\ado_mssql\introspection.py", line 27, in get_relations my_field_dict = _name_to_index(cursor, table_name) File "c:\python25\lib\site-packages\django\db\backends\ado_mssql\introspection.py", line 20, in _name_to_index return dict([(d[0], i) for i, d in enumerate(get_table_description(cursor, table_name))]) File "c:\python25\lib\site-packages\django\db\backends\ado_mssql\introspection.py", line 12, in get_table_description cursor.execute("SELECT TOP 1 * FROM %s" % table_name) File "c:\python25\lib\site-packages\django\db\backends\util.py", line 12, in execute return self.cursor.execute(sql, params) File "c:\python25\Lib\site-packages\adodbapi\adodbapi.py", line 592, in execute self.executeHelper(operation,0,parameters) File "c:\python25\Lib\site-packages\adodbapi\adodbapi.py", line 552, in executeHelper self._raiseCursorError(DatabaseError,tracebackhistory) File "c:\python25\Lib\site-packages\adodbapi\adodbapi.py", line 407, in _raiseCursorError eh(self.conn,self,errorclass,errorvalue) File "c:\python25\Lib\site-packages\adodbapi\adodbapi.py", line 38, in standardErrorHandler raise errorclass(errorvalue) adodbapi.adodbapi.DatabaseError: ----------- Strategy 1: Traceback:Traceback (most recent call last): File "c:\python25\Lib\site-packages\adodbapi\adodbapi.py", line 540, in executeHelper adoRetVal=self.cmd.Execute() File "<COMObject ADODB.Command>", line 3, in Execute File "C:\Python25\lib\site-packages\win32com\client\dynamic.py", line 258, in _ApplyTypes_ result = self._oleobj_.InvokeTypes(*(dispid, LCID, wFlags, retType, argTypes) + args) com_error: (-2147352567, 'Exception occurred.', (0, 'Microsoft OLE DB Provider for SQL Server', 'Cannot create new connection because in manual or distributed transaction mode.', None, 0, -2147467259), None) ----------- Strategy 2: Traceback:Traceback (most recent call last): File "c:\python25\Lib\site-packages\adodbapi\adodbapi.py", line 540, in executeHelper adoRetVal=self.cmd.Execute() File "<COMObject ADODB.Command>", line 3, in Execute File "C:\Python25\lib\site-packages\win32com\client\dynamic.py", line 258, in _ApplyTypes_ result = self._oleobj_.InvokeTypes(*(dispid, LCID, wFlags, retType, argTypes) + args) com_error: (-2147352567, 'Exception occurred.', (0, 'Microsoft OLE DB Provider for SQL Server', 'Cannot create new connection because in manual or distributed transaction mode.', None, 0, -2147467259), None) ----------- Strategy 3: Traceback:Traceback (most recent call last): File "c:\python25\Lib\site-packages\adodbapi\adodbapi.py", line 540, in executeHelper adoRetVal=self.cmd.Execute() File "<COMObject ADODB.Command>", line 3, in Execute File "C:\Python25\lib\site-packages\win32com\client\dynamic.py", line 258, in _ApplyTypes_ result = self._oleobj_.InvokeTypes(*(dispid, LCID, wFlags, retType, argTypes) + args) com_error: (-2147352567, 'Exception occurred.', (0, 'Microsoft OLE DB Provider for SQL Server', 'Cannot create new connection because in manual or distributed transaction mode.', None, 0, -2147467259), None) ----------- Strategy 4: Traceback:Traceback (most recent call last): File "c:\python25\Lib\site-packages\adodbapi\adodbapi.py", line 540, in executeHelper adoRetVal=self.cmd.Execute() File "<COMObject ADODB.Command>", line 3, in Execute File "C:\Python25\lib\site-packages\win32com\client\dynamic.py", line 258, in _ApplyTypes_ result = self._oleobj_.InvokeTypes(*(dispid, LCID, wFlags, retType, argTypes) + args) com_error: (-2147352567, 'Exception occurred.', (0, 'Microsoft OLE DB Provider for SQL Server', 'Cannot create new connection because in manual or distributed transaction mode.', None, 0, -2147467259), None) --- ADODBAPI on command:SELECT TOP 1 * FROM Action_Object_Permissions with parameters: ()
comment:4 by , 17 years ago
Resolution: | → invalid |
---|---|
Status: | new → closed |
This should become part of the external mssql backend I asked for over in #2358.
patch for django.db.backends.ado_mssql.introspection