0

在 [myapp]/sql/[model-name].sql 中,我有一些现有的 SQL 语句,我想在 CREATE TABLE 命令之后用作自定义挂钩。

我的应用程序位于 INSTALLED_APPS 中。如果我运行,我会看到列出的./manage.py sql

找到了我的自定义钩子;如果我运行以下任何命令,我会看到 SQL 语句输出:

./manage.py sqlall <myapp> ./manage.py sqlcustom <myapp> ./manage.py sql <myapp>

我在我的 Mac 上使用 postgres 9.x。

如果我psql到同一个数据库(没有用户)并将它们从 .sql 文件复制并将它们粘贴到 psql 命令输入中,它们都可以工作......所以我相信它们是 postgres 理解的有效 SQL。这些都是非常简单的 INSERT 语句(下面提到的夹具)。

但是,如果我运行./manage.py syncdb这些语句要么不运行,要么它们被忽略或发生静默错误;我所知道的是新行不会出现在数据库中。我正在跟踪 postgres 日志文件,并且在运行 syncdb 时没有记录任何内容,所以我不知道它是否没有找到我的 .sql 文件,或者在它到达数据库之前解析它并发现一些错误。

我已经创建了一个 .json 文件,用于固定装置,与这些语句等效,并且./manage.py loaddata <path-to-json-file>工作正常:我的站点现在在数据库中显示这些值。这让我相信我的设置文件是正确的,并且我在 postgres 中写入的数据库设置正确,并且我在运行./manage.py.

我在其他帖子中看到 django 文档是错误的,我应该将自定义钩子放在“模型”目录中,但我不知道这是否正确;如果sqlallsqlcustom找到我的钩子,不应该syncdb找到它吗?此外,我(还)没有模型目录,可能不需要它。

出于各种原因,我宁愿不使用 JSON 格式,但如果必须的话,我会......但是我在 .sql 格式上投入了很多时间,我真的很想知道发生了什么(而且我已经看够了)现有的相关问题,这可能对其他人有帮助)。

4

2 回答 2

0

我相信我找到了它,尽管它是基于行为而不是任何真正的研究。我只是在任何地方都将“tile”更改为“tilexx”,并且它起作用了。这个 django-project 帖子表明,如果存在某种 python 类名冲突,自定义 SQL 将不会被执行......并且“平铺”是很常见的事情。

所以答案是将我的班级名称更改为更独特的名称。

于 2012-11-28T23:48:48.660 回答
0

我一直在寻找类似问题的答案,试图用我从要移植到 Django 的 Flask 应用程序中转储的数据初始化一个 sqlite 数据库。与 OP 一样,以下所有内容都做了正确的事情:

./manage.py sqlall <myapp> ./manage.py sqlcustom <myapp> ./manage.py sql <myapp>

但是,myapp/sql/myapp.sql 中的插入语句并未运行。仔细阅读文档发现了这个线索:

Django 提供了一个钩子,用于传递数据库任意 SQL,该 SQL在您运行 syncdb 时在 CREATE TABLE 语句之后执行。

(重点补充)

问题是我已经注册了我的模型并运行了syncdb,所以有问题的表已经存在于数据库中,尽管它还没有数据。我推断,正因为如此,该CREATE TABLE语句没有在后续执行 syncdb 时运行,因此,我的自定义 sql 无法在该语句之后运行。解决方案是DROP table table_name然后再次运行 syncdb,此时我的自定义 sql 已运行。

于 2014-04-23T00:40:31.707 回答