为啥 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 说主键为空? [复制]的主要内容,如果未能解决你的问题,请参考以下文章