18

我将尝试构建一个 Web 应用程序,用户可以在其中访问 URL、登录并查看报告和其他信息。但是,报告的数据存储在外部数据库中。这是一个 MySQL 数据库,我可以访问它。

我对谷歌做了一些研究,但没有找到任何例子。我已经对连接多个数据库做了一些阅读 - https://docs.djangoproject.com/en/dev/topics/db/multi-db/所以看起来我可以连接到数据库了。

下一部分是我卡住的地方。数据库中的数据将随时更新。我不想能够编辑信息,我也不想能够覆盖任何东西。我只是希望能够连接到数据库拉取所需的信息,然后通过模板查看以供用户查看。首先,因为数据一直在更新,这会是一个问题吗?(我希望不是!)

连接到数据库后,能够提取数据然后将其转换为可以输出到模板的格式的最佳方法是什么?我是否需要将数据导入模型,然后使用视图进行控制。或者我需要用 JSON 或 XML 转换数据吗?

我对 python / django 相当陌生,所以任何帮助将不胜感激。如果您需要更多信息,请提前询问并感谢。:)

4

3 回答 3

27

没问题!我一直这样做。

至于“不要编辑或更新数据”,只是不要在您的应用程序中添加任何会更新数据的内容。Salem 关于在 MySQL 端使用权限的建议也是一个好主意。

要检索数据,您有两种选择:

1) 您可以创建与 MySQL 数据库中的表相对应的 Django 模型。您可以手动执行此操作,也可以将“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})

最后——Django 非常乐意使用 MySQL 作为数据库。如果你的 DBA 允许 Django 在同一个数据库中创建它的表,它可能会简化事情。

于 2013-05-17T01:16:46.363 回答
2

为了使您对数据库的访问“只读”,我想最好的选择是在 MySQL 端创建一个只使用 SELECT 的限制:

GRANT SELECT ON target_database.* TO your_user@'your_host' IDENTIFIED BY 'your_password';

这将确保在任何情况下更新/更改都会成功。

通常,您将数据库表建模为对象,因为这样可以更轻松地从 Python 处理数据库记录并为您提供一些抽象,但如果您认为这是正确的做法,您可以执行原始 SQL 查询。

根据您想要呈现数据的方式,您可能需要将其转换为某种东西。

如果您想让您的应用程序更具动态性(例如,每隔 10 秒检索一次新数据并在不刷新的情况下将其呈现给用户),您可能需要将其转换为更适合与 AJAX 一起使用的格式,例如 JSON 或XML(Django 有一些可以使用的序列化工具)。如果您只想要一个“静态”应用程序(即:用户单击链接/按钮并转到显示数据的页面,并且要刷新用户必须刷新页面),您可以使用从数据库中检索到的对象在你看来。

于 2013-05-16T20:25:40.443 回答
1

如果数据正在更新,则不会有问题。

现在要从数据库中检索数据,您首先必须在视图中导入相关模型

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}}
于 2013-05-16T20:21:26.013 回答