【问题标题】:django syncdb does not appear to run my custom hookdjango syncdb 似乎没有运行我的自定义钩子
【发布时间】: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 文档是错误的,我应该将自定义挂钩放在“模型”目录中,但我不知道这是否正确;如果sqlallsqlcustom 找到我的钩子,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


【解决方案1】:

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

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

【讨论】:

  • 将我的答案标记为已回答,因为它确实修复了它。
【解决方案2】:

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

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

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

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

(强调)

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

【讨论】:

    猜你喜欢
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    • 2014-06-22
    • 1970-01-01
    • 2015-09-22
    • 2021-11-27
    • 1970-01-01
    • 2022-12-04
    相关资源
    最近更新 更多