Django 1.11提供了创建数据库索引的新方法.到目前为止,我们db_index=True在每个领域都有:
# example 1
class Person(models.Model):
name = models.CharField(db_index=True)
age = models.IntegerField(db_index=True)
Run Code Online (Sandbox Code Playgroud)
现在我们已经models.Index和可能indexes在class Meta块内声明- 甚至是index_together.
那说我有两个疑问:
1.示例1中的代码是否与下面的示例2完全相同?
# example 2
class Person(models.Model):
name = models.CharField()
age = models.IntegerField()
class Meta:
indexes = [
models.Index(fields=['name']),
models.Index(fields=['age'])
]
Run Code Online (Sandbox Code Playgroud)
2. index多个字段怎么样index_together?下面的例子3和4做了完全相同的事情?
# example 3
class Person(models.Model):
name = models.CharField()
age = models.IntegerField()
class Meta:
indexes = [
models.Index(fields=['name', 'age'])
]
Run Code Online (Sandbox Code Playgroud)
# example 4
class Person(models.Model):
name = models.CharField()
age …Run Code Online (Sandbox Code Playgroud) 我正在与Flask,SQLAlchemy,Alembic以及Flask(Flask-SQLAlchemy和Flask-Migrate)的包装器开展一个项目.我有四次迁移:
1c5f54d4aa34 -> 4250dfa822a4 (head), Feed: Countries
312c1d408043 -> 1c5f54d4aa34, Feed: Continents
41984a51dbb2 -> 312c1d408043, Basic Structure
<base> -> 41984a51dbb2, Init Alembic
Run Code Online (Sandbox Code Playgroud)
当我启动一个新的干净的数据库并尝试运行迁移时,我收到一个错误:
vagrant@precise32:/vagrant$ python manage.py db upgrade
...
sqlalchemy.exc.ProgrammingError: (ProgrammingError) relation "continent" does not exist
...
Run Code Online (Sandbox Code Playgroud)
如果我要求Flask-Migrate运行所有迁移,但是最后一次,它可以运行.如果之后我再次运行升级命令,它就可以工作 - 也就是说,它完全升级我的数据库而不需要对代码进行任何单一更改:
vagrant@precise32:/vagrant$ python manage.py db upgrade 312c1d408043
INFO [alembic.migration] Context impl PostgresqlImpl.
INFO [alembic.migration] Will assume transactional DDL.
INFO [alembic.migration] Running upgrade -> 41984a51dbb2, Init Alembic
INFO [alembic.migration] Running upgrade 41984a51dbb2 -> 312c1d408043, Basic Structure
vagrant@precise32:/vagrant$ python manage.py db upgrade
INFO …Run Code Online (Sandbox Code Playgroud)