Как отобразить данные из mysql на сайте django?
Есть у меня две базы:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
},
'mysql_db': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'ИМя2',
'USER': 'ИМя1',
'PASSWORD': 'Пароль',
'HOST': 'Айпи',
'PORT': 'Порт',
}
}
пытаюсь в странице отобразить информацию из БД mysql. но показывает ошибку:
Internal Server Error: /show_table/
Traceback (most recent call last):
File "C:\Users\USER\forTemplate\env\lib\site-packages\django\db\backends\utils.py", line 105, in _execute
return self.cursor.execute(sql, params)
File "C:\Users\USER\forTemplate\env\lib\site-packages\django\db\backends\mysql\base.py", line 76, in execute
return self.cursor.execute(query, args)
File "C:\Users\USER\forTemplate\env\lib\site-packages\MySQLdb\cursors.py", line 179, in execute
res = self._query(mogrified_query)
File "C:\Users\USER\forTemplate\env\lib\site-packages\MySQLdb\cursors.py", line 330, in _query
db.query(q)
File "C:\Users\USER\forTemplate\env\lib\site-packages\MySQLdb\connections.py", line 280, in query
_mysql.connection.query(self, query)
MySQLdb.ProgrammingError: (1146, "Table 'CreateSite.webApp_secondmodel' doesn't exist")
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "C:\Users\USER\forTemplate\env\lib\site-packages\django\core\handlers\exception.py", line 55, in inner
response = get_response(request)
File "C:\Users\USER\forTemplate\env\lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\USER\Documents\projects\webTemplate\main\webApp\views.py", line 79, in show_table
print(all_objects)
File "C:\Users\USER\forTemplate\env\lib\site-packages\django\db\models\query.py", line 360, in __repr__
data = list(self[: REPR_OUTPUT_SIZE + 1])
File "C:\Users\USER\forTemplate\env\lib\site-packages\django\db\models\query.py", line 366, in __len__
self._fetch_all()
File "C:\Users\USER\forTemplate\env\lib\site-packages\django\db\models\query.py", line 1949, in _fetch_all
self._result_cache = list(self._iterable_class(self))
File "C:\Users\USER\forTemplate\env\lib\site-packages\django\db\models\query.py", line 91, in __iter__
results = compiler.execute_sql(
File "C:\Users\USER\forTemplate\env\lib\site-packages\django\db\models\sql\compiler.py", line 1623, in execute_sql
cursor.execute(sql, params)
File "C:\Users\USER\forTemplate\env\lib\site-packages\django\db\backends\utils.py", line 122, in execute
return super().execute(sql, params)
File "C:\Users\USER\forTemplate\env\lib\site-packages\django\db\backends\utils.py", line 79, in execute
return self._execute_with_wrappers(
File "C:\Users\USER\forTemplate\env\lib\site-packages\django\db\backends\utils.py", line 92, in _execute_with_wrappers
return executor(sql, params, many, context)
File "C:\Users\USER\forTemplate\env\lib\site-packages\django\db\backends\utils.py", line 100, in _execute
with self.db.wrap_database_errors:
File "C:\Users\USER\forTemplate\env\lib\site-packages\django\db\utils.py", line 91, in __exit__
raise dj_exc_value.with_traceback(traceback) from exc_value
File "C:\Users\USER\forTemplate\env\lib\site-packages\django\db\backends\utils.py", line 105, in _execute
return self.cursor.execute(sql, params)
File "C:\Users\USER\forTemplate\env\lib\site-packages\django\db\backends\mysql\base.py", line 76, in execute
return self.cursor.execute(query, args)
File "C:\Users\USER\forTemplate\env\lib\site-packages\MySQLdb\cursors.py", line 179, in execute
res = self._query(mogrified_query)
File "C:\Users\USER\forTemplate\env\lib\site-packages\MySQLdb\cursors.py", line 330, in _query
db.query(q)
File "C:\Users\USER\forTemplate\env\lib\site-packages\MySQLdb\connections.py", line 280, in query
_mysql.connection.query(self, query)
django.db.utils.ProgrammingError: (1146, "Table 'CreateSite.webApp_secondmodel' doesn't exist")
Ясно и понятно, что такой схемы CreateSite.webApp_secondmodel в БД Mysql не существует, потому и выдает такую ошибку. но как мне отобразить данные из существующей таблицы в mysql? и как мне отобразить в странице такой запрос из mysql:
SELECT * FROM ИМя2.table_ericsson_2g_v WHERE Reg IN ('BU','VV','ZB','AM') LIMIT 5
Сервер БД Mysql находится удаленно и подключаюсь удаленно. у меня получалось в скриптах получить данные из той БД библиотекой mysql-connector-python==9.1.0. У джанго другая так полагаю библиотека используется только mysqlclient==2.2.7. ее и использую. не знаю, что может и есть способы подянуть другой библиотекой. данные из второй базы sqlite3 в другой странице отображаются корректно. Код в models:
from django.db import models
from django_ckeditor_5.fields import CKEditor5Field
class Content(models.Model):
title = models.CharField(max_length=255, verbose_name="Название")
#content = models.CharField(max_length=255, verbose_name="Контент")
content = CKEditor5Field('Контент', config_name='extends')
idcard = models.CharField(max_length=255, verbose_name="Карта")
idmenu = models.CharField(max_length=255, verbose_name="Меню")
author = models.CharField(max_length=255, verbose_name="Автор поста")
date = models.CharField(max_length=255, verbose_name="Дата поста")
def __str__(self):
return self.title
class SecondModel(models.Model):
# Поля вашей модели
field1 = models.CharField(max_length=100)
field2 = models.CharField(max_length=100)
#class Meta:
# Указывает, что эта модель использует вторую базу данных
# using = 'mysql_db'
# Если вы хотите указать имя таблицы в базе данных
# db_table = 'table_ericsson_2g_v'
код во views:
from django.shortcuts import render
from .models import Content, SecondModel
from rest_framework import viewsets
from .serializers import ContentSerializer
#from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework.renderers import TemplateHTMLRenderer
# Create your views here.
class ContentViewSet(viewsets.ModelViewSet):
queryset = Content.objects.all()
serializer_class = ContentSerializer
class MyDRFHTMLView(APIView):
renderer_classes = [TemplateHTMLRenderer]
def get(self, request):
print('Кто-то зашёл на главную!')
contents_list = Content.objects.all() # Получить все объекты из модели
#print(contents_list)
json_data = {}
for raw in contents_list:
#print(raw.idmenu)
if raw.idmenu not in json_data:
json_data[raw.idmenu] = []
json_data[raw.idmenu].append({
'id': raw.id,
'title': raw.title,
'content': raw.content,
'idcard': raw.idcard,
'idmenu': raw.idmenu,
'author': raw.author,
'date': raw.date
})
return render(request, 'webPages/index.html', {'json_data': json_data})
class MyDRFHTMLView2(APIView):
renderer_classes = [TemplateHTMLRenderer]
template_name = 'webPages/indexV2.html' # Specify the template
#def get(self, request, *args, **kwargs):
def get(self, request):
print('Кто-то зашёл на главную!')
return render(request, 'webPages/indexV2.html')
#def display_second_data(request):
# # Извлекаем все объекты из SecondModel
# #second_data = SecondModel.objects.all()
# second_data = SecondModel.objects.using('mysql_db').all()
# print(second_data)
# context = {'data': second_data}
# return render(request, 'webPages/indexV3.html', context)
def show_table(request):
# Получить все объекты из таблицы
all_objects = SecondModel.objects.using('mysql_db').all()
print(all_objects)
context = {'items': all_objects}
return render(request, 'webPages/indexV3.html', context)
Код urls:
from django.urls import include, path
from . import views
from rest_framework.routers import DefaultRouter
from .views import ContentViewSet, MyDRFHTMLView, MyDRFHTMLView2
router = DefaultRouter()
router.register(r'content', ContentViewSet)
urlpatterns = [
#path('', include(router.urls)), #/urls/
path('', include(router.urls)), #/urls/
path('info/', MyDRFHTMLView.as_view(), name='info'),
path('info2/', MyDRFHTMLView2.as_view(), name='info2'),
#path('data/', views.get, name='display_data'),
path('show_table/', views.show_table, name='show_table'),
]
код html:
<h1>Данные из второй базы данных</h1>
<ul>
{% for item in items %}
<li>{{ item.field1 }} - {{ item.field2 }}</li>
{% endfor %}
</ul>
Есть такое предчувствие что использую не правильно models. в admin.py нужно было добавлять строку admin.site.register(SecondModel)? я ее добавил после миграции
python manage.py makemigrations
ython manage.py migrate