我正在使用 martini、golang 和 postgresql 构建一个社交网络类型的服务器作为练习,以帮助发展我在这三个方面的技能。几个关键的事情是如何将用户表中的主键插入用户信息表的正确行(以将用户信息与特定用户连接起来)。我相信还有一种方法可以将两个查询合并到一个更简洁的 postgres 脚本中......
func CreateUser(ren render.Render, r *http.Request, db *sql.DB) {
_, err := db.Query("INSERT INTO users (first, last, email, password, karma, value) SELECT CAST ($3 AS VARCHAR), $1, $2, $4, $5, $6 WHERE NOT EXISTS (SELECT * FROM users WHERE email = $3)",
r.FormValue("first"),
r.FormValue("last"),
r.FormValue("email"),
r.FormValue("password"),
0,
0)
PanicIf(err)
_, err = db.Query("INSERT INTO userinfo (usr, dob, phonenum, bio, mates, bought, sold) VALUES ($1, $2, $3, $4, $5, $6, $7)",
0,
r.FormValue("dob"),
r.FormValue("phonenum"),
r.FormValue("bio"),
0,
0,
0)
PanicIf(err)
ren.Redirect("/")
}
下面是创建用户表的脚本:
DROP TABLE IF EXISTS "public"."users";
CREATE TABLE "public"."users" (
"id" serial NOT NULL,
"first" varchar(40) NOT NULL COLLATE "default",
"last" varchar(40) NOT NULL COLLATE "default",
"email" varchar(40) NOT NULL COLLATE "default",
"password" varchar(40) NOT NULL COLLATE "default",
"karma" int NOT NULL,
"value" int NOT NULL
)
WITH (OIDS=FALSE);
我意识到在生产级代码中我不想像这样存储密码。我也对如何将非全局参数拉入数据库感到困惑,因为它是由 m.get 和 m.post 命令创建的。
m.Post("/newuser", CreateUser)
m.Get("/user", NewUser)
任何关于将用户的密钥合并和添加到 userinfo 中的适当条目的任何建议都将不胜感激......我意识到这些可能是非常愚蠢的问题,但请原谅我的天真。