使用 django 从外部数据库中提取数据到模板
Posted
技术标签:
【中文标题】使用 django 从外部数据库中提取数据到模板【英文标题】:Pulling data to the template from an external database with django 【发布时间】:2013-05-11 20:48:59 【问题描述】:我将尝试构建一个网络应用程序,用户可以在其中访问 URL、登录并查看报告和其他信息。但是,报告的数据存储在外部数据库中。这是一个 mysql 数据库,我可以访问它。
我对谷歌做了一些研究,但没有找到任何例子。我对连接多个数据库做了一些阅读 - https://docs.djangoproject.com/en/dev/topics/db/multi-db/ 所以看起来我可以连接到数据库了。
下一部分是我卡住的地方。数据库中的数据将随时更新。我不想能够编辑信息,我也不想能够覆盖任何东西。我只是希望能够连接到数据库拉取所需的信息,然后通过模板查看以供用户查看。首先,因为数据一直在更新,这会是一个问题吗? (希望不会!)
一旦我连接到数据库,最好能够提取数据,然后将其转换为我可以输出到模板的格式?我是否需要将数据导入模型,然后使用视图进行控制。或者我需要用 JSON 或 XML 转换数据吗?
我对 python / django 还很陌生,所以任何帮助都将不胜感激。如果您需要更多信息,请提前询问并感谢。 :)
【问题讨论】:
【参考方案1】:没问题!我一直这样做。
就“不要编辑或更新数据”而言,不要在您的应用中添加任何会更新数据的内容。 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 在同一个数据库中创建表,这可能会简化事情。
【讨论】:
感谢您的所有回复,让我有足够的信息继续下去。我需要设置一个新的应用程序来将信息提取到一个新的 models.py 文件中吗?此外,当数据被拉入模型时,信息是否会在我每次刷新页面时更新,就像在模板上显示一样? 您不需要为 MySQL 类创建一个单独的应用程序,但欢迎您创建它。我现在正在查看我的代码,并将我的远程东西设置为模型的子模块。 (myapp/models、myapp/models/somethingelse、myapp/models/anotherthing)。那是因为在我的情况下,我在 myapp/models 中有项目,这些项目包装了来自“somethingelse”和“otherthing”的实例。你也可以创建一个新的应用程序来隔离它,或者你可以给所有的名字加上前缀。 WRT 数据更新:如果您使用类似上述示例的方法,那么答案是“是”。查询将每次都被执行并且是最新的。如果您不想要这种行为,则必须添加自己的缓存。 好的,谢谢,我会尝试将模型添加到我现有的应用程序中以进行测试。我将在我的设置文件中设置数据库,我将如何连接到外部数据库?我可以添加托管数据库的 IP 吗? 见docs.djangoproject.com/en/dev/topics/db/multi-db。那里有一个例子。为您的主数据库保留一个“默认”条目,为您的外部数据库保留另一个条目(示例使用“用户”)【参考方案2】:为了使您对数据库的访问“只读”,我想最好的选择是创建一个在 MySQL 端使用的限制,只有 SELECT:
GRANT SELECT ON target_database.* TO your_user@'your_host' IDENTIFIED BY 'your_password';
这将确保在任何情况下更新/更改都会成功。
通常您将数据库表建模为对象,因为这样可以更轻松地从 Python 处理数据库记录并为您提供一些抽象,但如果您认为这是正确的做法,您可以执行 raw SQL queries。
根据您想要呈现数据的方式,您可能需要将其转换为某种东西。
如果您想让您的应用程序更具动态性(例如,每隔 10 秒检索一次新数据并在不刷新的情况下将其呈现给用户),您可能需要将其转换为更适合与 AJAX 一起使用的格式,例如 JSON 或 XML(Django 有一些 serialization 工具可供使用)。如果您只想要一个“静态”应用程序(即:用户单击链接/按钮并转到显示数据的页面,并且要刷新用户必须刷新页面),您可以使用从数据库中检索到的对象在你看来。
【讨论】:
有没有办法测试与外部数据库的连接?就像我在使用 GUI 一样运行脚本? 是的,您可以使用from django.db import connections; c=connections["external_db"].cursor()
之类的名称。您可以将其包装在 try/except 块中(如果您没有获得任何异常连接成功)。还要检查this。
非常好的细节。新版本的 Django 1.10 是否适用,是否有更好的时尚方式来做到这一点?我宁愿在 settings.py 中定义我的外部数据库。【参考方案3】:
如果数据正在更新,就没有问题。
现在要从数据库中检索数据,您首先必须导入相关模型 在你看来
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
【讨论】:
以上是关于使用 django 从外部数据库中提取数据到模板的主要内容,如果未能解决你的问题,请参考以下文章
如何将 jquery datepicker 从模板传递到 python Django 中查看?
无论 Django 中的模板更改(或发生其他外部问题)如何,在后台提取大型 zip 文件的最佳方法是啥?