为啥 Heroku 说主键为空? [复制]

Posted

技术标签:

【中文标题】为啥 Heroku 说主键为空? [复制]【英文标题】:Why is Heroku saying that Primary Key is Null? [duplicate]为什么 Heroku 说主键为空? [复制] 【发布时间】:2021-03-19 05:16:41 【问题描述】:

我刚刚让我的烧瓶应用程序在 heroku 上运行,但现在注册页面给了我一个错误(我尝试注册为“另一个用户”):

ValueError:“id”列中的空值违反非空约束 详细信息:失败行包含 (null, Another, User, anotheruser, 2020-12-18, another@user.com, pbkdf2:sha256:150000$Qfubfcls$9d8b1492272dee1c8b200ff34d5a2e73e4..., 0, 0, null)。

Here is the CREATE statement for the users table:
```sql
CREATE TABLE 'users' 
(
     'id' integer PRIMARY KEY NOT NULL, 
     'fname' varchar(255), 
     'lname' varchar(255), 
     'username' varchar(255), 
     'dob' date, 
     'email' varchar(255), 
     'password' varchar(255), 
     points INTEGER DEFAULT 0, 
     problems INTEGER DEFAULT 0, 
     bio VARCHAR(200)
)

据我所知,主键不能为 NULL,而且我在部署到 Heroku 之前已经注册,但我使用的是 SQLite3,现在我使用的是 PostgreSQL。登录仍然有效。

我正在使用 CS50 库,这是导致错误的寄存器路由中的 INSERT 语句:

db.execute("INSERT INTO users(fname, lname, username, dob, email, password) VALUES (:fname, :lname, :username, :dob, :email, :hash)",
            fname = request.form.get("fname"), lname = request.form.get("lname"),
            username = request.form.get("username"), dob = request.form.get("birth"),
            email = request.form.get("email"), hash = generate_password_hash(request.form.get("pwd")))

【问题讨论】:

因为它为空。您的 INSERT 不包含 ID,并且您的 ID 字段未设置为自动递增。 【参考方案1】:

您的insert 语句没有为id 提供值,因此它隐含为null,因此insert 失败,因为主键不能是null。您可以在插入时显式地给它一个值,但是通过将列定义为serial,让数据库为您处理它可能会更容易。

【讨论】:

以上是关于为啥 Heroku 说主键为空? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

sql 关联查询外键为空的情况

为啥 Flask SQL Alchemy 允许保存 None 的主键?

mysql表中,表的外键关联自身主键,为啥插入不了数据?

AddServiceEndpoint 抛出键为空?

当键为空时,Bigquery 合并连接

为啥字符串可以为空? [复制]