我有一些现有的SQL语句,我想在[myapp] / sql / [model-name] .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命令输入中,它们都可以工作......所以我相信它们是有效的SQL postgres理解。这些都是非常简单的INSERT语句(下面介绍的装置)。
但是,如果我运行./manage.py syncdb
这些语句要么没有运行,要么被忽略或发生无提示错误;我所知道的是新行没有出现在数据库中。我正在拖尾postgres日志文件,当我运行syncdb时没有记录任何内容,因此我不知道它是否找不到我的.sql文件,或解析它并在它到达数据库之前发现一些错误。
我为夹具创建了一个.json文件,并且相当于这些语句,./manage.py loaddata <path-to-json-file>
正常工作:我的网站现在在数据库中显示这些值。这让我相信我的设置文件是正确的,我在postgres中写的数据库设置正确,我在运行./manage.py
时有写权限。
我在其他帖子中看到django文档错误,我应该将自定义挂钩放在'models'目录中,但我不知道这是否正确;如果sqlall
和sqlcustom
找到了我的钩子,那么syncdb
不应该找到它吗?此外,我还没有(还)有一个模型目录,可能不需要它。
出于各种原因,我宁愿不使用JSON格式,但如果必须的话,我会...但是我已经投入了很多时间在.sql格式中我真的想知道发生了什么(而且我'已经看到了足够的现有相关问题,这可能有助于其他人。)
答案 0 :(得分:0)
我相信我找到了它,虽然它是基于行为而不是任何真正的研究。我只是将'tile'改为'tilexx'到处都有效。 This django-project post表示如果存在某种python类名冲突,则不会执行自定义SQL ...而'tile'是一种非常常见的事情。
所以答案是将我的班级名称更改为更独特的名称。
答案 1 :(得分:0)
我一直在寻找类似问题的答案,试图用我从移植到Django的Flask应用程序转储的数据初始化sqlite数据库。像OP一样,以下所有方面做得都是正确的:
./manage.py sqlall <myapp> ./manage.py sqlcustom <myapp> ./manage.py sql <myapp>
但是,myapp / sql / myapp.sql中的insert语句没有运行。仔细阅读documentation就会发现这条线索:
Django提供了一个钩子,用于在运行syncdb时传递数据库任意SQL 在CREATE TABLE语句之后执行。
(强调补充)
问题是我已经注册了我的模型并运行了syncdb,因此有问题的表已经存在于数据库中,尽管它还没有数据。我推断,因为这样,CREATE TABLE
语句没有在后续执行syncdb时运行,因此,我的自定义sql无法在该语句之后运行。解决方案是DROP table table_name
,然后再次运行syncdb,此时运行了自定义sql。