Postgres 中不需要的回滚 - 提交后丢失数据

问题描述 投票:0回答:1

我正在尝试在 Docker 中使用 Flask 和 PostgreSQL 创建一个简单的注册和登录 Web 应用程序。我还添加了 pgAdmin 因为我想查看我的数据库。我的网络应用程序有一个奇怪的问题。我可以创建新用户(注册),然后登录到我创建的用户,但如果我使用 pgAdmin 检查我的数据库,它是空的。在日志中我注意到每次提交后都会有一个回滚。我一直在尝试调试它但没有成功。

这就是我创建新用户的方式:

new_user = User(email=email, username=username, password=password)
db.session.add(new_user)
db.session.commit()
login_user(new_user, remember=True)
flash('Account created!', category='success')
return redirect(url_for('home.html'))

这就是我的用户表的样子:

class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(150), unique=True)
password = db.Column(db.String(150))
username = db.Column(db.String(150))

这是回滚日志:

"GET /sign-up HTTP/1.1" 200 -
Created Database! <----------- This is the second creation of database
INFO sqlalchemy.engine.Engine BEGIN (implicit)
INFO sqlalchemy.engine.Engine SELECT "user".id AS user_id, 
"user".email 
AS user_email, "user".password AS user_password, "user".username AS 
user_username 
FROM "user" 
WHERE "user".email = %(email_1)s 
LIMIT %(param_1)s
INFO sqlalchemy.engine.Engine [generated in 0.00048s] {'email_1': 
'[email protected]', 'param_1': 1}
INFO sqlalchemy.engine.Engine INSERT INTO "user" (email, password,             
username) VALUES (%(email)s, %(password)s, %(username)s) RETURNING                 
"user".id
INFO sqlalchemy.engine.Engine [generated in 0.00041s] {'email':     
'[email protected]', 'password': 'test', 'username': 'test'}
INFO sqlalchemy.engine.Engine COMMIT
INFO sqlalchemy.engine.Engine BEGIN (implicit)
INFO sqlalchemy.engine.Engine SELECT "user".id AS user_id, 
"user".email     
AS user_email, "user".password AS user_password, "user".username AS         
user_username 
FROM "user" 
WHERE "user".id = %(pk_1)s
INFO sqlalchemy.engine.Engine [generated in 0.00045s] {'pk_1': 1}
INFO sqlalchemy.engine.Engine ROLLBACK
"POST /sign-up HTTP/1.1" 302 -
INFO sqlalchemy.engine.Engine BEGIN (implicit)
INFO sqlalchemy.engine.Engine SELECT "user".id AS user_id, 
"user".email AS user_email, "user".password AS user_password, 
"user".username AS user_username 
FROM "user" 
WHERE "user".id = %(pk_1)s
INFO sqlalchemy.engine.Engine [generated in 0.00040s] {'pk_1': 1}
INFO sqlalchemy.engine.Engine ROLLBACK
"GET / HTTP/1.1" 200 -

我还在日志中注意到数据库被创建了两次。这就是我创建数据库的方式

with app.app_context():   
    db.create_all()
    print('Created Database!')

数据库是在一开始就创建的,这是正确的。以下是日志

CREATE TABLE "user" (
 id SERIAL NOT NULL, 
 email VARCHAR(150), 
 password VARCHAR(150), 
 username VARCHAR(150), 
 PRIMARY KEY (id), 
 UNIQUE (email)
)
Created Database!

然后,当我访问注册页面时,我会看到日志“已创建数据库!”再次。只有打印语句。

"GET /sign-up HTTP/1.1" 200 -
Created Database!

感谢您的回答,如果我的片段中有任何遗漏,我很抱歉。我很乐意提供更多。

postgresql flask-sqlalchemy pgadmin rollback
1个回答
0
投票

如您所见,数据库名称是“User”。查询的基本语法是

SELECT * FROM table_name;
但如果你使用我的数据库名称:
SELECT * FROM User;
你会得到不同的表,因为“user”是 PostgreSQL 中的保留关键字。 当表名与保留关键字匹配时,需要将表名用双引号括起来=“user”。

封装后,一切按预期进行。很抱歉这个初学者的错误。

© www.soinside.com 2019 - 2024. All rights reserved.