Вытягивание данных в шаблон из внешней базы данных с помощью django

Я собираюсь создать веб-приложение, в котором пользователи могут посещать URL-адрес, просматривать и просматривать отчеты и другую информацию. Однако данные для отчетов хранятся во внешней базе данных. Это база данных MySQL, к которой у меня будет доступ.

Я немного поработал над google и не испытываю большого успеха в поиске примеров. Я немного поучаствовал в подключении к нескольким базам данных - https://docs.djangoproject.com/en/dev/topics/db/multi-db/ Итак, я могу подключиться к базе данных нормально.

В следующей части я застрял. Данные в базе данных будут обновляться все время. Я не хочу иметь возможность редактировать информацию и не хочу, чтобы я мог перезаписать что-либо. Я просто хочу, чтобы иметь возможность подключиться к БД, вытащить требуемую информацию, а затем просмотреть ее через шаблон, чтобы пользователь мог видеть. Прежде всего потому, что данные постоянно обновляются, будет ли это проблемой? (Надеюсь, нет!)

Как только я подключился к базе данных, что лучше всего, чтобы вытащить данные, а затем поместить их в формат, который я могу вывести на шаблон? Нужно ли мне импортировать данные в модели, а затем управлять ими. Или мне нужно будет преобразовать данные с помощью JSON или XML?

Я новичок в python/django, поэтому любая помощь будет высоко оценена. Если вам нужна дополнительная информация, пожалуйста, спросите и заблаговременно.:)

Ответ 1

Нет проблем! Я делаю это все время.

Что касается "не изменять или обновлять данные", просто не добавляйте ничего в свое приложение, которое бы обновляло данные. Салемское предложение об использовании разрешений на стороне MySQL также является хорошей идеей.

Для получения данных у вас есть две возможности:

1) Вы можете создавать модели Django, соответствующие вашим таблицам в базе данных MySQL. Вы можете сделать это вручную, или вы можете использовать команду "inspectdb" с помощью manage.py, чтобы дать вам хорошую отправную точку. Затем сделайте что-то вроде этого:

def myview(request):
  rows = MyModel.objects.using('mysql').all()
  return render_to_response("mytemplate.html", {"rows" : rows })

2) Вы можете управлять соединениями и запросами вручную в своем приложении. Это совершенно верно в представлении:

def myview(request):
  conn = MySQLdb.connect("connection info here")
  try:
    cursor = conn.cursor()
    cursor.execute("select * from mytable")
    rows = cursor.fetchall()
  finally:
    conn.close()

  return render_to_response("mytemplate.html", {"rows" : rows})

finally - Django с удовольствием использует MySQL в качестве базы данных. Это может упростить ситуацию, если ваш DBA позволит Django создавать свои таблицы прямо в той же базе данных.

Ответ 2

Не будет проблем при обновлении данных.

Теперь для извлечения данных из базы данных вам сначала нужно импортировать соответствующую модель в ваших представлениях

from app_name.models import model_name
def view_report(request):
    r_name=request.POST.get('r_name','default_value')
    r=model_name.objects.get(report_name=r_name)
    return render_to_response('url',{'r':r})

В вашем шаблоне

{{r.report_desc}}

Ответ 3

Чтобы сделать ваш доступ к базе данных "только для чтения", я думаю, что лучшим вариантом является создание ограниченного использования на стороне MySQL с помощью только SELECT:

GRANT SELECT ON target_database.* TO [email protected]'your_host' IDENTIFIED BY 'your_password';

Это гарантирует, что в любом случае обновление/изменение будет успешным.

Обычно вы моделируете таблицы базы данных как объекты, потому что это упрощает работу с записями базы данных из Python и дает вам некоторую абстракцию, но вы можете выполнить raw SQL запросов, если вы считаете, что это правильная вещь.

В зависимости от того, как вы хотите представить свои данные, вам может потребоваться преобразовать его в нечто.

Если вы хотите сделать ваше приложение более динамичным (например, получение новых данных через 10 секунд и представление его пользователю без обновления), вам, вероятно, потребуется преобразовать его в какой-то формат, более подходящий для использования с AJAX, как JSON или XML (у Django есть некоторые serialization инструменты, готовые к использованию). Если вам просто нужно "статическое" приложение (то есть: пользователь щелкает по ссылке/кнопке и переходит на страницу, где представлены данные, и для обновления пользователь должен обновить страницу), вы можете использовать объекты, извлеченные из базы данных на ваш взгляд.