简体   繁体   中英

SyntaxError: invalid syntax on lib/python3.8/site-packages/sql_server/pyodbc/base.py django deploy on Linux

**

  1. Preface (Testing HyperV Virtual Server with os: Ubuntu Server 20.04.1 on local Windows PC)

**

I am having problems deploying my Django app (using Python 3.8.2) on a Ubuntu Server 20.04.1 LTS that uses MS SQL Server as its database. No issues reverting back to 'ENGINE': 'django.db.backends.sqlite3' on Linux but I have to be honest, it is frustrating.

I already had to downgrade to Django==3.0 to get my app working on my local windows pc but the 2 migrations I did proves that I am missing something and I hope someone can give me a hand. Any help is appreciated.

  1. My PC

Working settings.py file (currently running on windows with Sql Server 2019 Express

    DATABASES = {
    'default': {
        'ENGINE': 'sql_server.pyodbc',
        'NAME': 'mdm_db',
        'USER': 'AAA',
        'PASSWORD': 'AAA',
         'HOST': 'localhost\\SQLEXPRESS',
        'PORT': '',

        'OPTIONS': {
            'driver': 'SQL Server Native Client 11.0',
            # 'driver': 'ODBC Driver 13 for SQL Server ', -> port 1433?
        },
    },
    }
installed components:
    pip freeze
    asgiref==3.2.10
    Django==3.0
    django-mssql-backend==2.8.1
    pyodbc==4.0.30
    pytz==2020.1
    sql-server.pyodbc==1.0
    sqlparse==0.3.1
  1. Ubuntu Server

(also tried using ODBC and installing the latest version https://docs.microsoft.com/it-it/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server?view=sql-server-ver15 )

DATABASES = {
    'default': {
        'ENGINE': 'sql_server.pyodbc',
        'NAME': 'mdm_db',
        'USER': 'mdmuser',
        'PASSWORD': 'mdmuser',
         'HOST': 'localhost\\SQLEXPRESS',
        'PORT': '',
        'OPTIONS': {
            #'driver': 'SQL Server Native Client 11.0',
             'driver': 'ODBC Driver 17 for SQL Server ',
        },
    },
    }

Packages installed

:~/app/MDM_SQLServer$ history | grep install

   32  sudo apt-get install unixodbc-dev
   34  sudo apt-get install python3-dev
   36  sudo apt-get install build-essential libssl-dev libffi-dev python3-dev
   60  sudo ACCEPT_EULA=Y apt-get install msodbcsql17
  1. Issue: (venv) luca@webserver:~/app/MDM_SQLServer$ python manage.py runserver

Watching for file changes with StatReloader
Exception in thread django-main-thread:
Traceback (most recent call last):
  File "/usr/lib/python3.8/threading.py", line 932, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.8/threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
  File "/home/luca/app/venv/lib/python3.8/site-packages/django/utils/autoreload.py", line 53, in wrapper
    fn(*args, **kwargs)
  File "/home/luca/app/venv/lib/python3.8/site-packages/django/core/management/commands/runserver.py", line 109, in inner_run
    autoreload.raise_last_exception()
  File "/home/luca/app/venv/lib/python3.8/site-packages/django/utils/autoreload.py", line 76, in raise_last_exception
    raise _exception[1]
  File "/home/luca/app/venv/lib/python3.8/site-packages/django/core/management/__init__.py", line 357, in execute
    autoreload.check_errors(django.setup)()
  File "/home/luca/app/venv/lib/python3.8/site-packages/django/utils/autoreload.py", line 53, in wrapper
    fn(*args, **kwargs)
  File "/home/luca/app/venv/lib/python3.8/site-packages/django/__init__.py", line 24, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/home/luca/app/venv/lib/python3.8/site-packages/django/apps/registry.py", line 114, in populate
    app_config.import_models()
  File "/home/luca/app/venv/lib/python3.8/site-packages/django/apps/config.py", line 211, in import_models
    self.models_module = import_module(models_module_name)
  File "/usr/lib/python3.8/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 783, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/home/luca/app/MDM_SQLServer/cpus/models.py", line 6, in <module>
    from sites.models import Site
  File "/home/luca/app/MDM_SQLServer/sites/models.py", line 4, in <module>
    from wifis.models import Wifi
  File "/home/luca/app/MDM_SQLServer/wifis/models.py", line 3, in <module>
    class Wifi(models.Model):
  File "/home/luca/app/venv/lib/python3.8/site-packages/django/db/models/base.py", line 121, in __new__
    new_class.add_to_class('_meta', Options(meta, app_label))
  File "/home/luca/app/venv/lib/python3.8/site-packages/django/db/models/base.py", line 325, in add_to_class
    value.contribute_to_class(cls, name)
  File "/home/luca/app/venv/lib/python3.8/site-packages/django/db/models/options.py", line 208, in contribute_to_class
    self.db_table = truncate_name(self.db_table, connection.ops.max_name_length())
  File "/home/luca/app/venv/lib/python3.8/site-packages/django/db/__init__.py", line 28, in __getattr__
    return getattr(connections[DEFAULT_DB_ALIAS], item)
  File "/home/luca/app/venv/lib/python3.8/site-packages/django/db/utils.py", line 207, in __getitem__
    backend = load_backend(db['ENGINE'])
  File "/home/luca/app/venv/lib/python3.8/site-packages/django/db/utils.py", line 111, in load_backend
    return import_module('%s.base' % backend_name)
  File "/usr/lib/python3.8/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "/home/luca/app/venv/lib/python3.8/site-packages/sql_server/pyodbc/base.py", line 7
    except ImportError, e:
                      ^
SyntaxError: invalid syntax

NOTE Prompt is not returned, I need to corntol+C out.

Test2 New Env

luca@webserver:~/app/MDM_SQLServer$ source test2/bin/activate
(test2) luca@webserver:~/app/MDM_SQLServer$ pipinstall -r req
req.txt           requirements.txt
(test2) luca@webserver:~/app/MDM_SQLServer$ pipinstall -r req.txt
pipinstall: command not found
(test2) luca@webserver:~/app/MDM_SQLServer$ pip install -r req.txt
Collecting asgiref==3.2.10
  Using cached asgiref-3.2.10-py3-none-any.whl (19 kB)
Collecting Django==3.0
  Using cached Django-3.0-py3-none-any.whl (7.4 MB)
Collecting django-mssql-backend==2.8.1
  Using cached django_mssql_backend-2.8.1-py3-none-any.whl (52 kB)
Collecting pyodbc==4.0.30
  Using cached pyodbc-4.0.30.tar.gz (266 kB)
Collecting pytz==2020.1
  Using cached pytz-2020.1-py2.py3-none-any.whl (510 kB)
Processing /home/luca/.cache/pip/wheels/a9/78/cf/dc91ed794c352243f2796a29991293fd578c91f6584b0682f7/sql_server.pyodbc-1.0-py3-none-any.whl
Collecting sqlparse==0.3.1
  Using cached sqlparse-0.3.1-py2.py3-none-any.whl (40 kB)
Building wheels for collected packages: pyodbc
  Building wheel for pyodbc (setup.py) ... error
  ERROR: Command errored out with exit status 1:
   command: /home/luca/app/MDM_SQLServer/test2/bin/python -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-tth7v6fw/pyodbc/setup.py'"'"'; __file__='"'"'/tmp/pip-install-tth7v6fw/pyodbc/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' bdist_wheel -d /tmp/pip-wheel-lr00jtg6
       cwd: /tmp/pip-install-tth7v6fw/pyodbc/
  Complete output (6 lines):
  usage: setup.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
     or: setup.py --help [cmd1 cmd2 ...]
     or: setup.py --help-commands
     or: setup.py cmd --help

  error: invalid command 'bdist_wheel'
  ----------------------------------------
  ERROR: Failed building wheel for pyodbc
  Running setup.py clean for pyodbc
Failed to build pyodbc
Installing collected packages: asgiref, pytz, sqlparse, Django, pyodbc, django-mssql-backend, sql-server.pyodbc
    Running setup.py install for pyodbc ... done
Successfully installed Django-3.0 asgiref-3.2.10 django-mssql-backend-2.8.1 pyodbc-4.0.30 pytz-2020.1 sql-server.pyodbc-1.0 sqlparse-0.3.1
(test2) luca@webserver:~/app/MDM_SQLServer$

Thanks in advance

The except ImportError, e syntax shown in the error message is deprecated . pyodbc only claims to support Python 2.7, 3.4, 3.5, and 3.6.

Given that all of those versions except Python 3.6 have reached end of life, I suspect that pyodbc isn't maintained much anymore. Ideally, find a better library. If you must use this one, try with Python 3.6.

I resolved my issue by installing via pip django-pyodbc-azure- 2019 ==2.1.0.0, the "normal" django-azure-sql-backend has issues with Sql Server 2019. The error I was getting was getting SQL Server v15 is not supported: solution here . At the end (TEST2:see below) I found, what I think, is the best and most recent lib to use with a SQL Server database with django.

Here are the necessary steps I had to take on a clean virtual enviorment:

luca@webserver:~/app/MDM_SQLServer$ python3 -m venv venv2019
luca@webserver:~/app/MDM_SQLServer$ source venv2019/bin/activate
(venv2019) luca@webserver:~/app/MDM_SQLServer$ **pip install django**
Collecting django
  Downloading Django-3.1.1-py3-none-any.whl (7.8 MB)
     |████████████████████████████████| 7.8 MB 3.7 MB/s
Collecting asgiref~=3.2.10
  Using cached asgiref-3.2.10-py3-none-any.whl (19 kB)
Collecting sqlparse>=0.2.2
  Using cached sqlparse-0.3.1-py2.py3-none-any.whl (40 kB)
Collecting pytz
  Using cached pytz-2020.1-py2.py3-none-any.whl (510 kB)
Installing collected packages: asgiref, sqlparse, pytz, django
Successfully installed asgiref-3.2.10 django-3.1.1 pytz-2020.1 sqlparse-0.3.1
(venv2019) luca@webserver:~/app/MDM_SQLServer$ pip install django-pyodbc-azure-2019
Collecting django-pyodbc-azure-2019
  Using cached django_pyodbc_azure_2019-2.1.0.0-py3-none-any.whl (37 kB)
Collecting pyodbc>=3.0
  Using cached pyodbc-4.0.30.tar.gz (266 kB)
Collecting Django<2.2,>=2.1.0
  Using cached Django-2.1.15-py3-none-any.whl (7.3 MB)
Requirement already satisfied: pytz in ./venv2019/lib/python3.8/site-packages (from Django<2.2,>=2.1.0->django-pyodbc-azure-2019) (2020.1)
Building wheels for collected packages: pyodbc
  Building wheel for pyodbc (setup.py) ... error
  **ERROR: Command errored out with exit status 1:
   command: /home/luca/app/MDM_SQLServer/venv2019/bin/python3 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-hwv29w6j/pyodbc/setup.py'"'"'; __file__='"'"'/tmp/pip-install-hwv29w6j/pyodbc/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' bdist_wheel -d /tmp/pip-wheel-ot4s3z6t
       cwd: /tmp/pip-install-hwv29w6j/pyodbc/
  Complete output (6 lines):
  usage: setup.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
     or: setup.py --help [cmd1 cmd2 ...]
     or: setup.py --help-commands
     or: setup.py cmd --help

  error: invalid command 'bdist_wheel'
  ----------------------------------------
  ERROR: Failed building wheel for pyodbc
  Running setup.py clean for pyodbc
Failed to build pyodbc**
Installing collected packages: pyodbc, Django, django-pyodbc-azure-2019
    Running setup.py install for pyodbc ... done
  Attempting uninstall: Django
    Found existing installation: Django 3.1.1
    Uninstalling Django-3.1.1:
      Successfully uninstalled **Django-3.1.1**
Successfully installed **Django-2.1.15** django-pyodbc-azure-2019-2.1.0.0 pyodbc-4.0.30
(venv2019) luca@webserver:~/app/MDM_SQLServer$ pip freeze
asgiref==3.2.10
**Django==2.1.15**
**django-pyodbc-azure-2019==2.1.0.0**
pyodbc==4.0.30
pytz==2020.1
sqlparse==0.3.1
(venv2019) luca@webserver:~/app/MDM_SQLServer$ python manage.py runserver
Performing system checks...

System check identified no issues (0 silenced).
September 19, 2020 - 22:50:34
Django version 2.1.15, using settings 'mdm.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

TEST2 [lib django-mssql-backend 2.8.1] new hope (didn't want to use a Django 2.1.15 version)

luca@webserver:~/app/MDM_SQLServer$ python3 -m venv venvSQL
luca@webserver:~/app/MDM_SQLServer$ source venvSQL/bin/activate
(venvSQL) luca@webserver:~/app/MDM_SQLServer$ pip install django
Collecting django
  Using cached Django-3.1.1-py3-none-any.whl (7.8 MB)
Collecting sqlparse>=0.2.2
  Using cached sqlparse-0.3.1-py2.py3-none-any.whl (40 kB)
Collecting asgiref~=3.2.10
  Using cached asgiref-3.2.10-py3-none-any.whl (19 kB)
Collecting pytz
  Using cached pytz-2020.1-py2.py3-none-any.whl (510 kB)
Installing collected packages: sqlparse, asgiref, pytz, django
Successfully installed asgiref-3.2.10 django-3.1.1 pytz-2020.1 sqlparse-0.3.1
(venvSQL) luca@webserver:~/app/MDM_SQLServer$ pip install django-mssql-backend
Collecting django-mssql-backend
  Using cached django_mssql_backend-2.8.1-py3-none-any.whl (52 kB)
Collecting pyodbc>=3.0
  Using cached pyodbc-4.0.30.tar.gz (266 kB)
Building wheels for collected packages: pyodbc
  Building wheel for pyodbc (setup.py) ... error
  ERROR: Command errored out with exit status 1:
   command: /home/luca/app/MDM_SQLServer/venvSQL/bin/python3 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-ryv4vfy_/pyodbc/setup.py'"'"'; __file__='"'"'/tmp/pip-install-ryv4vfy_/pyodbc/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' bdist_wheel -d /tmp/pip-wheel-xzt70143
       cwd: /tmp/pip-install-ryv4vfy_/pyodbc/
  Complete output (6 lines):
  usage: setup.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
     or: setup.py --help [cmd1 cmd2 ...]
     or: setup.py --help-commands
     or: setup.py cmd --help

  **error: invalid command 'bdist_wheel'**
  ----------------------------------------
  ERROR: Failed building wheel for pyodbc
  Running setup.py clean for pyodbc
Failed to build pyodbc
Installing collected packages: pyodbc, django-mssql-backend
    Running setup.py install for pyodbc ... done
Successfully installed django-mssql-backend-2.8.1 pyodbc-4.0.30
(venvSQL) luca@webserver:~/app/MDM_SQLServer$ python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).

You have 1 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): auth.
Run 'python manage.py migrate' to apply them.
September 19, 2020 - 22:57:31
**Django version 3.1.1**, using settings 'mdm.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM