Alembic 是否可以在不访问数据库的情况下自动生成迁移?
例如,django/south 能够通过将 a 的当前版本Model与 .a 的先前快照Model进行比较来做到这一点。
我正在使用Django 1.2 trunk和South 0.7以及从django-annoying复制的AutoOneToOneField.South抱怨该字段没有定义规则,新版本的South不再具有自动字段类型解析器.所以我阅读了South文档并编写了以下定义(基本上是OneToOneField规则的精确副本):
rules = [
(
(AutoOneToOneField),
[],
{
"to": ["rel.to", {}],
"to_field": ["rel.field_name", {"default_attr": "rel.to._meta.pk.name"}],
"related_name": ["rel.related_name", {"default": None}],
"db_index": ["db_index", {"default": True}],
},
)
]
from south.modelsinspector import add_introspection_rules
add_introspection_rules(rules, ["^myapp"])
Run Code Online (Sandbox Code Playgroud)
现在,当我进行模式移植时,South会引发以下错误.
Traceback (most recent call last):
File "manage.py", line 11, in <module>
execute_manager(settings)
File "django/core/management/__init__.py", line 438, in execute_manager
utility.execute()
File "django/core/management/__init__.py", line 379, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "django/core/management/base.py", line 196, in run_from_argv
self.execute(*args, **options.__dict__)
File "django/core/management/base.py", line 223, in execute
output = self.handle(*args, **options) …Run Code Online (Sandbox Code Playgroud) 我有一个类别模型,其中包含一个循环外键.我从这个模型中转储了所有数据,并使用django-south创建了一个数据迁移,以便将它们加载到不同的DBMS中,但由于这种循环依赖性,我在执行它时遇到了很多问题.
这是我所指的模型:
class Category(MPTTModel):
name = models.CharField(_('name'), max_length=50, unique=True)
parent = models.ForeignKey('self', null=True, blank=True, related_name='categories')
description = models.TextField(_('description'), blank=True, null=True)
created_on = models.DateTimeField(auto_now_add = True, default=date.today())
updated_on = models.DateTimeField(auto_now = True, default=date.today())
def __unicode__(self):
return "%s" %(self.name)
class Meta:
verbose_name = _('category')
verbose_name_plural= _('categories')
Run Code Online (Sandbox Code Playgroud) 我正在使用Python/Django,我正在尝试使用South来管理我的数据库.在当地环境中工作得很好.当我部署到Heroku时出现问题.问题是当我用它创建迁移时
$heroku run manage.py schemamigration mydjangoapp
Run Code Online (Sandbox Code Playgroud)
看起来它的工作原理(shell确认了它)然而,然后我尝试使用迁移,它将无法正常工作.当我做:
$heroku run python manage.py migrate mydjangoapp
Run Code Online (Sandbox Code Playgroud)
我明白了
The app 'createtuto' does not appear to use migrations
Run Code Online (Sandbox Code Playgroud)
我检查了问题,看起来heroku不允许South在/ myDjangoapp/migrations创建迁移目录.
有什么办法可以让它发挥作用吗?
我尝试使用convert_to_south,但我得到了相同的结果:一开始看起来它有效,但它没有,没有创建迁移.
我在模型上编辑了两个字段,并将它们从IntegerFields 更改为TimeFields:
class Model(models.Model):
start_time = models.TimeField()
end_time = models.TimeField()
Run Code Online (Sandbox Code Playgroud)
我正在使用这两个字段来保存一个天真的时间,这与任何地理时间概念无关,因此没有真正的"时区"(想想类似于比赛时间的东西).我的本地数据库是PostgreSQL.
但是,此更改生成的南迁移失败,并出现以下错误:
> main:0005_auto__chg_field_model_start_time__chg_field_model_end_time
FATAL ERROR - The following SQL query failed: ALTER TABLE "main_model" ALTER COLUMN "start_time" TYPE time, ALTER COLUMN "start_time" SET NOT NULL, ALTER COLUMN "start_time" DROP DEFAULT;
...
File ".../lib/python2.7/site-packages/django/db/backends/postgresql_psycopg2/base.py", line 52, in execute
return self.cursor.execute(query, args)
django.db.utils.DatabaseError: column "start_time" cannot be cast to type time without time zone
Run Code Online (Sandbox Code Playgroud)
迁移失败的原因如下:
class Migration(SchemaMigration):
def forwards(self, orm):
# Changing field 'Model.start_time'
db.alter_column('main_model', 'start_time', self.gf('django.db.models.fields.TimeField')()) …Run Code Online (Sandbox Code Playgroud) 我收到一个DatabaseError,说没有名为playlist的列存在,我正在试图弄清楚如何修复它.我正在使用南方.我删除了我的迁移文件夹中的旧文件并运行:
python manage.py schemamigration app_name --initial
python manage.py migrate reserve
Run Code Online (Sandbox Code Playgroud)
当我这样做时,我收到此错误:
south.exceptions.GhostMigrations:
! These migrations are in the database but not on disk:
<reserve: 0002_initial>
! I'm not trusting myself; either fix this yourself by fiddling
! with the south_migrationhistory table, or pass --delete-ghost-migrations
! to South to have it delete ALL of these records (this may not be good).
Run Code Online (Sandbox Code Playgroud)
我不知道如何摆脱这个错误,因为在我的迁移文件夹中我只有init.py(c)和0001_initial.py(c); 我没有0002迁移文件了.
当我尝试运行服务器并在管理员中点击"添加播放列表"时,这就是我收到DatabaseError的时候.如果有帮助,我的models.py是:
class UserProfile(models.Model):
user = models.OneToOneField(User)
def __unicode__(self):
return self.user
def create_user_profile(sender, instance, created, **kwargs):
if created:
UserProfile.objects.create(user=instance) …Run Code Online (Sandbox Code Playgroud) 我有2个Django项目,其中包含以下数据库设置:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'db1', # 'db2' for second db
...
}
}
Run Code Online (Sandbox Code Playgroud)
尝试使用命令同步第二个db时
python manage.py syncdb --database = db2
我收到错误
django.db.utils.ConnectionDoesNotExist:连接db2不存在
当我使用其他一些命令时,South使用第一个项目的迁移并使用错误的表填充db2.如何正确同步/迁移单个Django + South实例提供的多个项目?
我正在尝试使用South将新的URLField添加到模型中,例如:
class Document(models.Model):
text = models.TextField()
reference_page = models.URLField(blank=True, null=True)
source_page = models.URLField(blank=True, null=True) # new field
Run Code Online (Sandbox Code Playgroud)
但是,当我运行时,python manage.py schemamigration myapp --auto我得到错误:
DatabaseError: column myapp_document.source_page does not exist
LINE 1: ...ext", "myapp_document"."reference_page", "myapp_doc...
Run Code Online (Sandbox Code Playgroud)
我正在使用PostgreSQL作为我的数据库后端.我正确地初始化了我的南方应用程序,并且已经为它运行了迁移.我确保我的Django和South安装是最新的.
为什么现在会给我这个错误?
编辑:奇怪的是,如果我手动创建数据库中的列,则schemamigration调用成功,但当然migrate调用失败,直到我手动删除列.这很奇怪.
我刚刚开始关注Alembic,来自Django,在那里我们有South来迁移我们的数据库模式(很快就会包括在内),它使用一个友好的旧固定宽度数字0037_fix_my_schema.py来讨论迁移的顺序.应用,我很自然地被Alembic的修订版ID所吸引.是否有DAG支持Alembic,或者有人可以在这方面对其内部进行一些概述?
revision sqlalchemy django-south directed-acyclic-graphs alembic
安装Django后,我收到此错误消息(当我想运行迁移或runserver时):
您的数据库没有南数据库模块'south.db.mysql'.请选择支持的数据库,检查SOUTH_DATABASE_ADAPTER [S]设置,或从INSTALLED_APPS中删除South.
我不想使用South,它也没有在INSTALLED_APPS中定义.为什么我收到此错误?
django-south ×10
django ×8
python ×4
alembic ×2
sqlalchemy ×2
database ×1
django-1.4 ×1
heroku ×1
model ×1
postgresql ×1
revision ×1