【发布时间】:2012-11-23 01:11:12
【问题描述】:
在 [myapp]/sql/[model-name].sql 中,我想在 CREATE TABLE 命令之后将一些现有的 SQL 语句用作自定义挂钩。
我的应用在 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 命令输入中,它们都可以工作......所以我相信它们是有效的 SQL 被理解后记。这些都是非常简单的 INSERT 语句(下面介绍了固定装置)。
但是,如果我运行./manage.py syncdb,这些语句要么不运行,要么被忽略,或者发生静默错误;我所知道的是新行不会出现在数据库中。我正在跟踪 postgres 日志文件,并且在运行 syncdb 时没有记录任何内容,所以我不知道它是否没有找到我的 .sql 文件,或者在它到达数据库之前对其进行解析并发现一些错误。
我已经创建了一个 .json 文件,用于固定装置,与这些语句等效,./manage.py loaddata <path-to-json-file> 工作正常:我的网站现在在数据库中显示这些值。这让我相信我的设置文件是正确的,并且我在 postgres 中写入的数据库设置正确,并且当我运行 ./manage.py 时我具有写入权限。
我在其他帖子中看到 django 文档是错误的,我应该将自定义挂钩放在“模型”目录中,但我不知道这是否正确;如果sqlall 和sqlcustom 找到我的钩子,syncdb 不应该找到它吗?另外我(还)没有模型目录,可能不需要它。
出于各种原因,我宁愿不使用 JSON 格式,但如果必须的话,我会...但是我在 .sql 格式上投入了很多时间,我真的很想知道发生了什么(而且我'已经看到足够多的现有相关问题,这可能对其他人有所帮助)。
【问题讨论】:
-
我确认,如果您的模型包是子目录,那么是的,sql 目录必须在模型中。有一张接受的票要求更改有关它的文档code.djangoproject.com/ticket/18954
-
感谢您的确认。我切换到模型目录格式(并在此过程中学到了很多东西!)。然后我将 .sql 文件放在模型内的 sql 目录中。 .sql 文件的标题是“tile.sql”,它与模型中的“tile.py”匹配,但仍然没有被调用。你还知道些什么?
-
我相信我找到了它,尽管它是基于行为而不是任何真正的研究。我只是在任何地方都将“tile”更改为“tilexx”,并且它起作用了。 This post 表示如果存在某种名称冲突,自定义 SQL 将不会被执行……而且 'tile' 是很常见的事情。
标签: django django-models django-syncdb