Python Django Postgres旧模型保留值太长,无法更改类型字符(25)
我有一个twitterapi项目,可以在本地主机(SQLite3)和现有服务器(Postgres)上正常工作。我正在将它迁移到DigitalOcean(也是Postgres),现在遇到了这样一个错误: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
值太长,无法更改类型字符(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
我在psqldrop数据库名中删除了数据库代码>,然后重新创建它,运行syncdb并在south迁移(出于各种原因,我仍然使用1.6)-为什么仍然存在
编辑:我刚刚三次检查了这个,完全更改了数据库,用不同的名称创建了一个新的数据库,但仍然是这样!我缺少什么?我已经进入服务器并查看了models.py,它们如图所示,我感到困惑
第二次编辑:在进入并运行schemamigration之后,它现在正在工作(嘎!),但我仍然想了解这里的行为,因为这不是我所期望的。如果您查看迁移目录,是否可以检查每次迁移的文件日期?大多数情况下,您可以通过迁移的名称知道它反映了模型中的什么变化。扩展最大长度的迁移导致例外,它是从今天开始运行schemamigration
的文件日期,还是有较旧的文件日期?到工作的更改是今天,另一个(只有两个),最初的迁移日期是2天前。我想这对我来说是个惊喜——尽管我已经放弃了DB并正在重建它,但除非我也删除了南迁移,否则它将返回到上次接受的迁移?是的,一旦开始为应用程序进行迁移,它们将成为一个重要且持久的部分(=在版本控制下)运行migrate
依赖于目录中所有可用的迁移。在开发过程中,在删除数据库之前删除迁移是完全可以的。但一旦应用程序被更多开发人员共享或部署到某个地方,保留迁移是至关重要的。