为django应用程序创建自定义pgsql类型的正确方法是什么,以便每次使用syncdb创建数据库时,在创建任何表之前创建所有自定义类型(以便表可以使用此类型)?
我也使用django-evolution,但这不是一个合适的解决方案 - 它在syncdb之后运行。我可以想象做一个解决方法,比如用标准字段类型定义模型,然后在演化中创建类型和改变列类型,但这绝对不是很好,有点模糊......
有什么想法吗?
答案 0 :(得分:1)
我不相信在Django中有办法做到这一点。您可能知道,有一个post_syncdb
信号,但pre_syncdb
没有信号。
所以我认为只有两个选择:将pre_syncdb
信号发送到Django或使用像Fabric这样的自动化工具。
攻击你自己的pre_syncdb
信号,即使这是正确的方法,可能也不会很简单,你必须在每个新的Django版本中维护补丁。
另一方面,不仅像Fabric这样的自动化工具很简单,而且它为您的项目提供了其他好处。
例如,我的Fabfile的一部分看起来像:
def createdb():
"Create a clean database"
run('createdb --encoding=UNICODE $(db_name) -O $(db_owner) -U $(db_owner)')
run('python manage.py syncdb --noinput')
在syncdb之前添加类似的内容:
run('psql -U $(db_owner) $(db_name) < app/sql/custom_types.sql')
你只需输入以下内容就可以了:
$ fab createdb
或:
$ fab cluster createdb
在您的环境中列出的名为cluster
的所有计算机上运行该命令。