django模型中的自定义表创建选项

时间:2016-06-12 14:16:17

标签: django mariadb

我有一个女孩模特(我的意思是django =)

class Girl(models.Model):
  id = models.AutoField(primary_key=True)

  first_name = models.TextField()
  last_name = models.TextField()
  nickname = models.TextField(blank=True, null=True)
  maiden_name = models.TextField(blank=True, null=

  about = models.TextField(blank=True, null=True)
  quotes = models.TextField(blank=True, null=True)
  activities = models.TextField(blank=True, null=True)
  books = models.TextField(blank=True, null=True)
  games = models.TextField(blank=True, null=True)
  tv = models.TextField(blank=True, null=True)
  interests = models.TextField(blank=True, null=True)
  movies = models.TextField(blank=True, null=True)
  music = models.TextField(blank=True, null=True)
  ...
  class Meta:
    managed = True
    db_table = 'girls'

故事:数据库是MariaDB + InnoDB,文本字段可能包含疯狂的大型unicode诗。 所以我很快遇到了这个问题http://instantbadger.blogspot.ru/2013/01/mysql-row-size-too-large-when-saving.html

问题:在MariDB中,没有办法通过变量(https://jira.mariadb.org/browse/MDEV-9646)为所有表指定默认的ROW_FORMAT

问题:如何在Meta或迁移文件本身中指定此选项以使django添加" ROW_FORMAT = COMPRESSED"最终的SQL?

1 个答案:

答案 0 :(得分:3)

您可以在迁移文件中添加自定义SQL迁移操作,如下所示:

operations = [
    ...
    migrations.RunSQL(""" YOUR SQL HERE """)
]

因为你想要的东西不能用Django原样完成,但你可以手动为改变表的迁移添加一行,如上所示。

请注意,这会降低您的项目的灵活性:如果您决定迁移到不支持该操作的存储后端,则您需要重写迁移。此外,当您更改模型时,更改不会反映在手写SQL中,这可能会破坏事物。说完这个,有时很难绕过手写的查询。

或者你可以写你自己的django包,将这个功能添加到模型的Meta中。这还需要编写自定义数据库后端,因为据我所知,不可能轻松地将自定义数据库操作添加到现有数据库后端。