0

我将我的数据库从 MySql 迁移到 PostgreSQL,并且,当我注意到许多表没有更新时,一些谷歌搜索告诉我做这样的事情:

ALTER SEQUENCE my_table_id_seq OWNED BY my_table.id;

事情开始奏效了。我必须为我所有的桌子这样做。

然后我意识到,在创建一个 django.contrib.auth.model.User 之后,然后尝试用一个post_save钩子创建一个 UserProfile,我会得到一个,IntegrityError因为user_id外键是作为 null 发送的。

这是发送到 PostgreSQL 的queryand args(在 Python 中):

INSERT INTO "auth_user" ("username", "first_name", "last_name", "email", "password", "is_staff", "is_active", "is_superuser", "last_login", "date_joined") VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s) (u'apitest04', '', '', u'a@a.aa', 'sha1$9f796$69c88c635c8a53a91544765d7996747cf326cfec', False, True, False, u'2013-01-05 12:39:07.384198', u'2013-01-05 12:39:07.384198')

INSERT INTO "myapp_userprofile" ("user_id", "website", "job", "hobbies", "timezone", "about", "company_name", "company_description", "company_website", "retailer_country", "avatar", "default_license", "default_watermark_text", "default_watermark", "default_watermark_position", "default_watermark_opacity", "language") VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) (None, None, None, None, None, None, None, None, None, None, None, 0, None, False, 0, 10, None)

我想正在发生的事情是auth_user在事务关闭之前序列 id 没有提前。我怀疑因为创建失败User时会回滚UserProfile,所以它们必须在同一个事务期间发生。

是否有可能由于交易尚未结束而以某种方式尚未返回idUser你建议我如何解决这个问题?

4

1 回答 1

1

问题解决了,它发生是因为auth_user.id序列没有所有者。这修复了它:

ALTER SEQUENCE auth_auth_id_seq OWNED BY auth_auth.id;
于 2013-01-05T20:41:35.967 回答