Python Django Postgres旧模型保留值太长,无法更改类型字符(25)

Python Django Postgres旧模型保留值太长,无法更改类型字符(25),python,django,postgresql,django-1.6,Python,Django,Postgresql,Django 1.6,我有一个twitterapi项目,可以在本地主机(SQLite3)和现有服务器(Postgres)上正常工作。我正在将它迁移到DigitalOcean(也是Postgres),现在遇到了这样一个错误:值太长,无法更改类型字符(25)我理解错误的含义,但感觉我所采取的步骤应该已经改变了它 我不想截断数据,所以我希望能够读入引发错误的任何内容,而这段代码可以在另一台服务器(Centos6)上运行,但不能在DO(Debian)上运行。两者都运行PostGres 9.3.4,都使用UTF8编码(Debi

我有一个twitterapi项目,可以在本地主机(SQLite3)和现有服务器(Postgres)上正常工作。我正在将它迁移到DigitalOcean(也是Postgres),现在遇到了这样一个错误:
值太长,无法更改类型字符(25)
我理解错误的含义,但感觉我所采取的步骤应该已经改变了它

我不想截断数据,所以我希望能够读入引发错误的任何内容,而这段代码可以在另一台服务器(Centos6)上运行,但不能在DO(Debian)上运行。两者都运行PostGres 9.3.4,都使用UTF8编码(Debian服务器上的区域设置也设置正确,因为我相信这可能会导致问题)。Debian服务器上的模板如下所示:

                                 List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+----------+----------+-------------+-------------+-----------------------
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
(3 rows)
考虑到我收到了一些错误的数据,我从CharFields改为TextFields,没有限制,但仍然遇到了错误——无论如何,这不是间歇性的,是每一条推特都遇到了异常。奇怪的是,它指定了“for type character variating(25)”,这是我不久前所受限制的旧版本,但我已经在psql中删除了数据库(多次…),并检查了服务器上是否部署了正确版本的代码

调试中的家伙,我不知道是哪个字段抛出了错误,但在psql中仔细检查后,我得到了表信息:

                                Table "public.harvester_tweet"
          Column           |           Type           |                          Modifiers                           
---------------------------+--------------------------+--------------------------------------------------------------
 id                        | integer                  | not null default nextval('harvester_tweet_id_seq'::regclass)
 truncated                 | boolean                  | not null
 text                      | text                     | not null
 in_reply_to_status_id     | bigint                   | 
 favorite_count            | integer                  | not null
 author_id                 | integer                  | not null
 _json                     | text                     | not null
 source                    | character varying(25)    | not null
 retweeted                 | boolean                  | not null
 coordinates               | text                     | 
 entities                  | text                     | 
 in_reply_to_screen_name   | character varying(25)    | 
 id_str                    | character varying(25)    | not null
 retweet_count             | integer                  | not null
 favorited                 | boolean                  | not null
 retweeted_status          | text                     | not null
 user                      | text                     | 
 geo                       | text                     | 
 in_reply_to_user_id_str   | character varying(25)    | 
 possibly_sensitive        | boolean                  | not null
 lang                      | character varying(5)     | not null
 created_at                | timestamp with time zone | not null
 in_reply_to_status_id_str | character varying(25)    | 
 place                     | text                     | 
Models.py

class Tweet(models.Model):
    truncated=models.BooleanField(default=False)
    text=models.TextField()
    in_reply_to_status_id=models.BigIntegerField(blank=True, null=True, default=None)
    favorite_count=models.IntegerField(default=0)
    author = models.ForeignKey(User)
    _json = models.TextField()
    source=models.TextField()
    retweeted=models.BooleanField(default=False)
    coordinates = models.TextField(blank=True, null=True)
    entities = models.TextField(blank=True, null=True)
    in_reply_to_screen_name = models.TextField(blank=True, null=True)
    id_str = models.TextField()
    retweet_count = models.IntegerField(default=0)
    favorited = models.BooleanField(default=False)
    retweeted_status = models.TextField()
    user = models.TextField(blank=True, null=True) #User is a dictionary in the response; here we take a serialised version
    geo = models.TextField(blank=True, null=True)
    in_reply_to_user_id_str = models.TextField(blank=True, null=True)
    possibly_sensitive = models.BooleanField(default=False)
    lang = models.TextField()
    created_at = models.DateTimeField()
    in_reply_to_status_id_str = models.TextField(null=True, blank=True)
    place = models.TextField(blank=True, null=True)
    def __unicode__(self):
        return unicode("@" + (self.author.screen_name) + " " + str(self.created_at))
读取它的代码如下所示:

def read_tweet(tweet_data, current_user):
    import logging
    logger = logging.getLogger('django')
    from datetime import date, datetime
    #print "Inside read_Tweet"
    from harvester.models import Tweet
    from django.core.exceptions import ObjectDoesNotExist
    from django.db import DataError
    #We might get weird results where user has changed their details"], so first we check the UID.
    #print tweet_data["created_at"]
    from dateutil.parser import parse
    tweet_data["created_at"] = parse(tweet_data["created_at"])
    try:
        #print "trying tweet_data["id"
        current_tweet =Tweet.objects.get(id_str=tweet_data["id_str"])
        created=False
        return current_user, created
    except ObjectDoesNotExist:
        pass

    try:
        current_tweet, created = Tweet.objects.get_or_create(
        truncated=tweet_data["truncated"],
        text=tweet_data["text"],
        favorite_count=tweet_data["favorite_count"],
        author = current_user,
        _json = {},
        source=tweet_data["source"],
        retweeted=tweet_data["retweeted"],
        coordinates = tweet_data["coordinates"],
        entities = tweet_data["entities"],
        in_reply_to_screen_name = tweet_data["in_reply_to_screen_name"],
        id_str = tweet_data["id_str"],
        retweet_count = tweet_data["retweet_count"],
        favorited = tweet_data["favorited"],
        user = tweet_data["user"],
        geo = tweet_data["geo"],
        in_reply_to_user_id_str = tweet_data["in_reply_to_user_id_str"],
        lang = tweet_data["lang"],
        created_at = tweet_data["created_at"],
        place = tweet_data["place"])
        print "DEBUG", current_user, current_tweet
        return current_tweet, created
    except DataError, e:
        #Catchall to pick up non-parsed tweets
        print "DEBUG ERROR", e, tweet_data
        return None, False
我在psql
drop数据库名中删除了数据库,然后重新创建它,运行syncdb并在south迁移(出于各种原因,我仍然使用1.6)-为什么仍然存在

编辑:我刚刚三次检查了这个,完全更改了数据库,用不同的名称创建了一个新的数据库,但仍然是这样!我缺少什么?我已经进入服务器并查看了models.py,它们如图所示,我感到困惑


第二次编辑:在进入并运行schemamigration之后,它现在正在工作(嘎!),但我仍然想了解这里的行为,因为这不是我所期望的。

如果您查看迁移目录,是否可以检查每次迁移的文件日期?大多数情况下,您可以通过迁移的名称知道它反映了模型中的什么变化。扩展
最大长度的迁移导致例外,它是从今天开始运行
schemamigration
的文件日期,还是有较旧的文件日期?到工作的更改是今天,另一个(只有两个),最初的迁移日期是2天前。我想这对我来说是个惊喜——尽管我已经放弃了DB并正在重建它,但除非我也删除了南迁移,否则它将返回到上次接受的迁移?是的,一旦开始为应用程序进行迁移,它们将成为一个重要且持久的部分(=在版本控制下)运行
migrate
依赖于目录中所有可用的迁移。在开发过程中,在删除数据库之前删除迁移是完全可以的。但一旦应用程序被更多开发人员共享或部署到某个地方,保留迁移是至关重要的。