Jon*_*han 1 django postgresql heroku
我在Heroku上使用postgresql为我的Django App.当我尝试为我的帖子发表评论时,我有时会得到这个错误(有时候不是所有时间).
尽管存在错误,但注释仍然保存,但save()之后的所有代码都不会执行.
这个问题只发生在postgresql上.在我使用sqlite的本地主机上,一切正常.
我不确定这是什么原因.
这就是我的模型的样子
class Comment(models.Model):
post = models.ForeignKey(post)
date = models.DateTimeField(auto_now_add=True)
comment = models.TextField()
comment_user = models.ForeignKey(User)
Run Code Online (Sandbox Code Playgroud)
这就是我的评论模型的样子.那是因为我没有添加max_length进行评论吗?这是Traceback
DatabaseError at /post/114/
value too long for type character varying(10)
Request Method: POST
Request URL: http://www.mysite.com/post/114/
Django Version: 1.4.1
Exception Type: DatabaseError
Exception Value:
value too long for type character varying(10)
Exception Location: /app/.heroku/venv/lib/python2.7/site-packages/django/db/backends/postgresql_psycopg2/base.py in execute, line 52
Python Executable: /app/.heroku/venv/bin/python2.7
Python Version: 2.7.2
Python Path:
['/app',
'/app/.heroku/venv/bin',
'/app/.heroku/venv/lib/python2.7/site-packages/pip-1.1-py2.7.egg',
'/app/.heroku/venv/lib/python2.7/site-packages/distribute-0.6.31-py2.7.egg',
'/app',
'/app/.heroku/venv/lib/python27.zip',
'/app/.heroku/venv/lib/python2.7',
'/app/.heroku/venv/lib/python2.7/plat-linux2',
'/app/.heroku/venv/lib/python2.7/lib-tk',
'/app/.heroku/venv/lib/python2.7/lib-old',
'/app/.heroku/venv/lib/python2.7/lib-dynload',
'/usr/local/lib/python2.7',
'/usr/local/lib/python2.7/plat-linux2',
'/usr/local/lib/python2.7/lib-tk',
'/app/.heroku/venv/lib/python2.7/site-packages',
'/app/.heroku/venv/lib/python2.7/site-packages/PIL']
Server time: Wed, 5 Dec 2012 20:41:39 -0600
Run Code Online (Sandbox Code Playgroud)
我无法帮助你处理Django部分(对不起),所以我只会说PostgreSQL.
在您的应用程序的某个地方,您有一个varchar(10)列,并且您正在尝试将超过10个字符的内容放入其中,您可能在某个地方缺少验证.SQLite忽略varchar(n)列中的大小并将其视为text没有大小限制; 所以你可以用SQLite做这样的事情:
sqlite> create table t (s varchar(5));
sqlite> insert into t (s) values ('Where is pancakes house?');
sqlite> select * from t;
s
where is pancakes house?
Run Code Online (Sandbox Code Playgroud)
没有投诉.类似地,SQLite允许您做一些荒谬的事情,比如将字符串放入数字列.
这是你需要做的:
停止使用varchar(n)PostgreSQL,只需使用text.在PostgreSQL中使用大小有限的字符串列是没有意义的,除非您有必须限制大小的硬性要求.从精细手册:
短字符串(最多126个字节)的存储要求是1个字节加上实际字符串,其中包括字符空间填充.较长的字符串有4个字节的开销而不是1.长字符串由系统自动压缩,因此磁盘上的物理要求可能更少.[...]如果您希望存储没有特定上限的长串,请使用
text......提示:这三种类型之间没有性能差异,除了使用空白填充类型时增加的存储空间,以及一些额外的CPU周期来检查存储到长度受限列中的长度.虽然
character(n)在其他一些数据库系统中具有性能优势,但PostgreSQL没有这样的优势; 事实上character(n),由于其额外的存储成本,通常是三者中最慢的.在大多数情况下text或character varying应该使用.
因此,除非必须,否则不要使用传统char和varcharPostgreSQL,只需使用text.
你可以从你的切换栏varchar(n),以text立即跟上SQLite的工作,而你得到PostgreSQL的启动和运行; text对于无限长度的字符串,这两个数据库都会很满意,这个简单的修复程序将帮助您解决当前的问题.然后,尽快将开发环境切换到PostgreSQL,以便在代码生成之前捕获这样的问题.
| 归档时间: |
|
| 查看次数: |
3456 次 |
| 最近记录: |