【问题标题】:"cannot be cast to type integer" error“无法转换为整数类型”错误
【发布时间】:2026-01-13 08:35:01
【问题描述】:

这是我的第一个问题,请耐心等待。

我将一些属性从 CharField 更改为 IntegerField。下面列出的是代码:

rating_choices = (
    (1,"1"),
    (2,"2"),
    (3,"3"),
    (4,"4"),
    (5,"5"),
)

class Rating(models.Model):
    article = models.ForeignKey(Article,null=True)
    organization = models.IntegerField(choices=rating_choices, default=1)
    support = models.IntegerField(choices=rating_choices, default=1)
    readability = models.IntegerField(choices=rating_choices, default=1)
    tags = models.IntegerField(choices=rating_choices, default=1)
    comments = models.TextField()
    def get_overall_rating(self):
        return fsum(self.organization + self.support + self.support + self.readability + self.tags)/5.0
    overall_rating = property(get_overall_rating)
admin.site.register(Rating)

我在 Postgres 上进行了南迁移,这是我得到的错误:

Error in migration: collect_data:0010_auto__chg_field_rating_tags__chg_field_rating_support__chg_field_ratin
Traceback (most recent call last):
  File "manage.py", line 15, in <module>
    execute_from_command_line(sys.argv)
  File "/Users/narensathiya/Documents/Documents/Jellow/Jellow/jellowenv/lib/python2.7/site-packages/django/core/management/__init__.py", line 443, in execute_from_command_line
    utility.execute()
  File "/Users/narensathiya/Documents/Documents/Jellow/Jellow/jellowenv/lib/python2.7/site-packages/django/core/management/__init__.py", line 382, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/Users/narensathiya/Documents/Documents/Jellow/Jellow/jellowenv/lib/python2.7/site-packages/django/core/management/base.py", line 196, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "/Users/narensathiya/Documents/Documents/Jellow/Jellow/jellowenv/lib/python2.7/site-packages/django/core/management/base.py", line 232, in execute
    output = self.handle(*args, **options)
  File "/Users/narensathiya/Documents/Documents/Jellow/Jellow/jellowenv/lib/python2.7/site-packages/south/management/commands/migrate.py", line 108, in handle
    ignore_ghosts = ignore_ghosts,
  File "/Users/narensathiya/Documents/Documents/Jellow/Jellow/jellowenv/lib/python2.7/site-packages/south/migration/__init__.py", line 213, in migrate_app
    success = migrator.migrate_many(target, workplan, database)
  File "/Users/narensathiya/Documents/Documents/Jellow/Jellow/jellowenv/lib/python2.7/site-packages/south/migration/migrators.py", line 235, in migrate_many
    result = migrator.__class__.migrate_many(migrator, target, migrations, database)
  File "/Users/narensathiya/Documents/Documents/Jellow/Jellow/jellowenv/lib/python2.7/site-packages/south/migration/migrators.py", line 310, in migrate_many
    result = self.migrate(migration, database)
  File "/Users/narensathiya/Documents/Documents/Jellow/Jellow/jellowenv/lib/python2.7/site-packages/south/migration/migrators.py", line 133, in migrate
    result = self.run(migration)
  File "/Users/narensathiya/Documents/Documents/Jellow/Jellow/jellowenv/lib/python2.7/site-packages/south/migration/migrators.py", line 107, in run
    return self.run_migration(migration)
  File "/Users/narensathiya/Documents/Documents/Jellow/Jellow/jellowenv/lib/python2.7/site-packages/south/migration/migrators.py", line 81, in run_migration
    migration_function()
  File "/Users/narensathiya/Documents/Documents/Jellow/Jellow/jellowenv/lib/python2.7/site-packages/south/migration/migrators.py", line 57, in <lambda>
    return (lambda: direction(orm))
  File "/Users/narensathiya/Documents/Documents/Jellow/Jellow/jellow/jellow/apps/collect_data/migrations/0010_auto__chg_field_rating_tags__chg_field_rating_support__chg_field_ratin.py", line 13, in forwards
    db.alter_column('collect_data_rating', 'tags', self.gf('django.db.models.fields.IntegerField')())
  File "/Users/narensathiya/Documents/Documents/Jellow/Jellow/jellowenv/lib/python2.7/site-packages/south/db/generic.py", line 44, in _cache_clear
    return func(self, table, *args, **opts)
  File "/Users/narensathiya/Documents/Documents/Jellow/Jellow/jellowenv/lib/python2.7/site-packages/south/db/generic.py", line 522, in alter_column
    flatten(values),
  File "/Users/narensathiya/Documents/Documents/Jellow/Jellow/jellowenv/lib/python2.7/site-packages/south/db/generic.py", line 273, in execute
    cursor.execute(sql, params)
  File "/Users/narensathiya/Documents/Documents/Jellow/Jellow/jellowenv/lib/python2.7/site-packages/django/db/backends/util.py", line 40, in execute
    return self.cursor.execute(sql, params)
  File "/Users/narensathiya/Documents/Documents/Jellow/Jellow/jellowenv/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 "tags" cannot be cast to type integer

任何帮助将不胜感激,并在此先感谢您!

【问题讨论】:

  • 您的数据库中的tags 列中是否已有任何非整数形式的项目?
  • 是的,应该有。我已将一些值保存为字符。我是否必须删除该列并重新制作它?

标签: database django django-south


【解决方案1】:

您需要添加“USING (col_name::integer)”来消除此错误。 但在这种情况下,您必须使用直接查询。

migrateEngine.execute('ALTER TABLE test ALTER COLUMN testScore TYPE INTEGER USING testScore::integer')

【讨论】:

    【解决方案2】:

    如果您愿意丢弃您的数据,您可以删除该列并创建一个新列

    如果你想保留你的数据,你需要

    a) 为您的新列指定一个不同的名称,或者
    b) 在过渡期间创建一个临时列来保存数据

    然后你需要一系列迁移

    1. 架构迁移以添加新(或临时)列
    2. 显式移动数据的数据迁移,执行任何所需的转换(例如“A”-> 1)
    3. 可能是架构迁移删除了您的临时列

    【讨论】:

    • 酷我之前没有做过数据迁移,所以我会试试看!
    最近更新 更多