Django 및 mysql 커넥터 python의 특성 오류
django 데이터베이스에 SQLite를 사용하고 있었는데 Synology NAS에서 MariaDb를 사용하고 싶습니다.
Python 3.9.0+와 MariaDB 10.3.24에서 장고 3.2를 사용합니다.
나는 mysql 커넥터로 pip 패키지 mysql-sql-sql==8.0.23을 사용합니다.
DATABASES = {
'default': {
'ENGINE': 'mysql.connector.django',
'NAME': 'energyHomeWeb_django',
'USER': 'energyHomeWeb',
'PASSWORD': 'password',
'HOST': '192.168.1.123',
'PORT': '3307',
'OPTIONS': {
'autocommit': True,
},
}
}
서버를 시작하거나 마이그레이션할 때 다음 오류가 발생합니다.
Exception in thread django-main-thread:
Traceback (most recent call last):
File "/usr/lib/python3.9/threading.py", line 950, in _bootstrap_inner
self.run()
File "/usr/lib/python3.9/threading.py", line 888, in run
self._target(*self._args, **self._kwargs)
File "/home/iomys/.virtualenvs/energyHomeWeb/lib/python3.9/site-packages/django/utils/autoreload.py", line 64, in wrapper
fn(*args, **kwargs)
File "/home/iomys/.virtualenvs/energyHomeWeb/lib/python3.9/site-packages/django/core/management/commands/runserver.py", line 121, in inner_run
self.check_migrations()
File "/home/iomys/.virtualenvs/energyHomeWeb/lib/python3.9/site-packages/django/core/management/base.py", line 486, in check_migrations
executor = MigrationExecutor(connections[DEFAULT_DB_ALIAS])
File "/home/iomys/.virtualenvs/energyHomeWeb/lib/python3.9/site-packages/django/db/migrations/executor.py", line 18, in __init__
self.loader = MigrationLoader(self.connection)
File "/home/iomys/.virtualenvs/energyHomeWeb/lib/python3.9/site-packages/django/db/migrations/loader.py", line 53, in __init__
self.build_graph()
File "/home/iomys/.virtualenvs/energyHomeWeb/lib/python3.9/site-packages/django/db/migrations/loader.py", line 220, in build_graph
self.applied_migrations = recorder.applied_migrations()
File "/home/iomys/.virtualenvs/energyHomeWeb/lib/python3.9/site-packages/django/db/migrations/recorder.py", line 77, in applied_migrations
if self.has_table():
File "/home/iomys/.virtualenvs/energyHomeWeb/lib/python3.9/site-packages/django/db/migrations/recorder.py", line 55, in has_table
with self.connection.cursor() as cursor:
File "/home/iomys/.virtualenvs/energyHomeWeb/lib/python3.9/site-packages/django/utils/asyncio.py", line 26, in inner
return func(*args, **kwargs)
File "/home/iomys/.virtualenvs/energyHomeWeb/lib/python3.9/site-packages/django/db/backends/base/base.py", line 259, in cursor
return self._cursor()
File "/home/iomys/.virtualenvs/energyHomeWeb/lib/python3.9/site-packages/django/db/backends/base/base.py", line 235, in _cursor
self.ensure_connection()
File "/home/iomys/.virtualenvs/energyHomeWeb/lib/python3.9/site-packages/django/utils/asyncio.py", line 26, in inner
return func(*args, **kwargs)
File "/home/iomys/.virtualenvs/energyHomeWeb/lib/python3.9/site-packages/django/db/backends/base/base.py", line 219, in ensure_connection
self.connect()
File "/home/iomys/.virtualenvs/energyHomeWeb/lib/python3.9/site-packages/django/utils/asyncio.py", line 26, in inner
return func(*args, **kwargs)
File "/home/iomys/.virtualenvs/energyHomeWeb/lib/python3.9/site-packages/django/db/backends/base/base.py", line 202, in connect
self.init_connection_state()
File "/home/iomys/.virtualenvs/energyHomeWeb/lib/python3.9/site-packages/mysql/connector/django/base.py", line 341, in init_connection_state
if self.features.is_sql_auto_is_null_enabled:
File "/home/iomys/.virtualenvs/energyHomeWeb/lib/python3.9/site-packages/django/utils/functional.py", line 48, in __get__
res = instance.__dict__[self.name] = self.func(instance)
File "/home/iomys/.virtualenvs/energyHomeWeb/lib/python3.9/site-packages/django/db/backends/mysql/features.py", line 150, in is_sql_auto_is_null_enabled
return self.connection.mysql_server_data['sql_auto_is_null']
File "/home/iomys/.virtualenvs/energyHomeWeb/lib/python3.9/site-packages/mysql/connector/django/base.py", line 290, in __getattr__
raise AttributeError
AttributeError
어떻게 고칠 수 있죠?
PS: mysqlclient는 가상 환경에서 작동하지 않으며 작동하는 방법을 찾을 수 없기 때문에 사용하지 않습니다.
마지막으로 Python 버전을 Python 3.8로 변경하고 mysqlclient는 Python 3.8에서 잘 작동합니다.
그래서 저는 그것을 사용했고 지금은 작동하지만, 이 구성에서는:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'energyHomeWeb_django',
'USER': 'energyHomeWeb',
'PASSWORD': 'password',
'HOST': '192.168.1.123',
'PORT': '3307',
'OPTIONS': {
'autocommit': True,
},
}
}
엔진이 올바르지 않습니다.
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'energyHomeWeb_django',
'USER': 'energyHomeWeb',
'PASSWORD': 'password',
'HOST': '192.168.1.123',
'PORT': '3307',
'OPTIONS': {
'autocommit': True,
},
}
}
저도 같은 오류가 발생했습니다.
파이프 동결 출력
asgiref==3.3.4
asttokens==2.0.4
colorama==0.4.4
Django==3.2
dnspython==1.16.0
executing==0.6.0
icecream==2.1.0
mysql-connector-python==8.0.23
protobuf==3.15.8
Pygments==2.8.1
pytz==2021.1
six==1.15.0
sqlparse==0.4.1
소스 코드를 검토한 후 venv/lib/site3.8/site-venv/site-venv/session/session/django/base.py 파일을 약간 변경하여 해결했습니다(venv를 사용하고 있다고 가정하고 가상 환경 venv라고 이름 지었습니다).
def __getattr__(self, attr):
if attr.startswith("mysql_is"):
return False
raise AttributeError
# copied from venv/lib/python3.8/site-packages/django/db/backends/mysql/base.py
# and modified to use with self.cursor() as cursor: (see init_connection_state() )
@cached_property
def mysql_server_data(self):
with self.cursor() as cursor:
# Select some server variables and test if the time zone
# definitions are installed. CONVERT_TZ returns NULL if 'UTC'
# timezone isn't loaded into the mysql.time_zone table.
cursor.execute("""
SELECT VERSION(),
@@sql_mode,
@@default_storage_engine,
@@sql_auto_is_null,
@@lower_case_table_names,
CONVERT_TZ('2001-01-01 01:00:00', 'UTC', 'UTC') IS NOT NULL
""")
row = cursor.fetchone()
return {
'version': row[0],
'sql_mode': row[1],
'default_storage_engine': row[2],
'sql_auto_is_null': bool(row[3]),
'lower_case_table_names': bool(row[4]),
'has_zoneinfo_database': bool(row[5]),
}
버전 8.0.24로 업그레이드하는 것은 다른 오류를 발생시키기 때문에 저에게는 선택사항이 아닙니다.
언급URL : https://stackoverflow.com/questions/67149216/attribueerror-with-django-and-mysql-connector-python
'programing' 카테고리의 다른 글
dll 옆에 있는 xml 파일의 용도는 무엇입니까? (0) | 2023.06.16 |
---|---|
VB.NET에서 정적 메서드 구현 (0) | 2023.06.16 |
VBA에서 무한대와 그 이상으로. (0) | 2023.06.11 |
Git: "추적되지 않은" 파일만 나열(또한 사용자 지정 명령) (0) | 2023.06.11 |
'의 의미합니까?IISReset' do? (0) | 2023.06.11 |