我在 sqlite 中有一个数据库,我想使用 Django 来呈现它并对其进行查询。
我知道如何通过在 中创建新类来创建新数据库models.py
,但是使用 Django 访问现有数据库的最佳方法是什么?
这似乎是一个分两部分的问题:首先,如何编写 django 模型类来表示现有数据库,其次如何与syncdb
.
第一个问题的答案是,django 模型的表达能力不足以描述每个可能的 SQL 数据库模式,而是使用与 ORM 的使用模式配合良好的子集。因此,您可能需要对架构进行一些调整,以便使用 django 模型对其进行描述。尤其是:
appname_modelname
,因为这种约定允许来自许多应用程序的表轻松地共存于同一个数据库中。如果您的架构恰好与 django 模型支持的子集匹配,或者您愿意进行更改以使其适应,那么您的任务就是编写与架构匹配的模型。该inspectdb
工具可以提供一个有用的起点。
您可以通过临时重新配置项目以使用不同的空数据库并运行来测试您是否成功描述了数据库manage.py syncdb
,然后将 Django 创建的模式与已经存在的模式进行比较。如果它们相同(或至少足够接近),那么您做对了。
如果您现有的数据库不能很好地匹配 Django ORM 的假设,那么更灵活的替代方案是SQLAlchemy。它本身并没有集成到 django 的应用程序系统中,但它确实提供了一个更完整的数据库接口,几乎可以与任何数据库一起使用;一些数据库很容易映射,而另一些则需要更多的手动映射工作,但几乎所有情况都应该有一些创造力。
至于与syncdb
: 的交互,此命令的默认行为是跳过似乎已经在数据库中具有表的任何模型。因此,如果您定义的模型确实与您现有的数据库表匹配,则应该不理会它们。但是,它将创建项目中其他应用程序所需的附加表,包括 Django 自己的表。
现代 Django支持多个数据库,这可以为您提供进一步的方法:将现有数据库配置为项目中的第二个数据库源,并使用数据库路由器确保从该第二个数据库加载适当的模型,并进一步确保 django 不会尝试syncdb
在此数据库上运行。这以一些额外的复杂性为代价提供了真正的分离,但它仍然要求您的模式与 ORM 的假设兼容。它也有一些限制,主要与保存在不同数据库中的对象之间的关系有关。
如果您希望能够对 Django 使用的数据库进行版本化更改,从您从现有数据库继承的模式开始,那么Southsyncdb
为支持运行任意 SQL 的内置机制提供了一个更灵活、更完整的替代方案数据定义语言语句来更改您的数据库模式。
听起来您需要像South这样的东西,它可以让您对模型进行版本化和恢复更改。