django syncdb似乎没有运行我的自定义挂钩

django syncdb似乎没有运行我的自定义挂钩,django,django-models,django-syncdb,Django,Django Models,Django Syncdb,在[myapp]/SQL/[model name].SQL中,我有一些现有的SQL语句,希望在CREATE TABLE命令之后用作自定义钩子 我的应用在已安装的应用中。如果运行/manage.py sql,我会看到列表 我的定制钩子找到了;如果运行以下任一操作,我将看到SQL语句输出: /manage.py sqlall /manage.py sqlcustom /manage.py sql 我在mac上使用postgres 9.x 如果我psql到同一个数据库(没有用户),并将它们从.sql文

在[myapp]/SQL/[model name].SQL中,我有一些现有的SQL语句,希望在CREATE TABLE命令之后用作自定义钩子

我的应用在已安装的应用中。如果运行
/manage.py sql
,我会看到列表

我的定制钩子找到了;如果运行以下任一操作,我将看到SQL语句输出:

/manage.py sqlall
/manage.py sqlcustom
/manage.py sql

我在mac上使用postgres 9.x

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

但是,如果我运行
/manage.py syncdb
,这些语句要么不运行,要么被忽略,要么发生无声错误;我只知道新行不会出现在数据库中。我正在跟踪postgres日志文件,在运行syncdb时没有记录任何内容,因此我不知道它是否没有找到我的.sql文件,或者在它进入数据库之前对其进行分析并发现一些错误

我已经为fixture创建了一个.json文件,其中包含这些语句的等效项,并且
/manage.py loaddata
工作正常:我的站点现在在数据库中显示这些值。这使我相信我的设置文件是正确的,我在postgres中写入的数据库设置是正确的,并且我在运行
/manage.py
时具有写入权限

我在另一篇文章中看到django文档是错误的,我应该将自定义挂钩放在“models”目录中,但我不知道这是否正确;如果
sqlall
sqlcustom
找到我的钩子,那么
syncdb
不应该找到它吗?此外,我还没有(还)一个模型目录,可能不需要它


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

我相信我找到了它,尽管它是基于行为而不是任何真正的研究。我只是简单地将“tile”改为“tilexx”,然后它就开始工作了。指示如果存在某种python类名冲突,将不会执行自定义SQL。。。“瓷砖”是一种很常见的东西


因此,答案是将我的类的名称更改为更独特的名称。

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

./manage.py sqlall <myapp> ./manage.py sqlcustom <myapp> ./manage.py sql <myapp>
/manage.py sqlall./manage.py sqlcustom./manage.py sql
但是,myapp/sql/myapp.sql中的insert语句没有运行。仔细阅读这本书可以发现这条线索:

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

(增加重点)


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

我确认,如果您的模型包是一个子目录,那么是的,sql目录必须位于模型内部。有一张接受的票证要求更改有关文件,谢谢确认。我切换到模型目录格式(并在这个过程中学到了很多!)。然后我将.sql文件放在模型内的sql目录中。.sql文件的标题是“tile.sql”,它与模型内部的“tile.py”匹配,但仍然没有被调用。你还知道什么吗?我相信我找到了,虽然它是基于行为而不是任何真正的研究。我只是简单地将“tile”改为“tilexx”,然后它就开始工作了。指示如果存在某种名称冲突,将不会执行自定义SQL。。。“瓷砖”是一个很常见的东西。把我的答案标记为回答,因为它确实解决了问题。