python - 使用烧瓶登录 - 插入后无法使用 SELECT 从 Postgres 获取数据
问题描述
所以我正在尝试使用 OAuth、Flask 和 Postgres 创建一个身份验证系统。我不太确定我的代码发生了什么。我为数据库创建了一个类,该类将容纳连接并在进行查询时创建游标。我还为用户创建了一个类,它将发送要在数据库类上执行的查询。
这就是我想要做的:
- 在主应用程序中,我们检查用户是否已通过身份验证
- 如果没有,我们将通过 OAuth/OpenConnect 的过程
- 一旦我们从 Google API 获得凭据,我们就会使用用户类中的方法检查数据库中是否有任何内容与响应中的 id 一起存储
- 如果没有找到id,我们使用用户类方法插入数据库进行查询
- 然后我们使用flask-login方法,
@login_manager.user_loader
然后调用用户类方法从数据库中SELECT - 我的问题出在哪里,我似乎无法检索数据
我尝试遵循一些资源来解决此问题:
不知道出了什么问题。我在终端上打开了 psql,当我运行 SELECT 时,我确实看到了具有正确 ID 的条目。但是我的应用程序无法获取数据。
数据库.py
import psycopg2
from psycopg2 import Error
class Database:
def __init__(self, db, user, password, port, host):
self.db = db
self.user = user
self.password = password
self.port = port
self.host = host
def connect(self):
self.connection = psycopg2.connect(
database=self.db,
user=self.user,
password=self.password,
port=self.port,
host=self.host
)
def executeQuery(self, query, values=None):
print('query:', query)
print('values:', values)
cursor = self.connection.cursor()
cursor.execute(query, values)
self.connection.commit()
cursor.close()
def close(self):
self.connection.close()
用户.py
from flask_login import UserMixin
from db import db
class User(UserMixin):
def __init__(self, id, name, email, profile_pic):
self.id = id
self.name = name
self.email = email
self.profile_pic = profile_pic
@staticmethod
def get(user_id):
user = db.executeQuery('SELECT * FROM users WHERE id=%s;', (user_id,))
print('user:', user)
if not user:
return None
current_user = user.fetchone()
user = User(
id = current_user[0],
name = current_user[1],
email = current_user[2],
profile_pic = current_user[3]
)
return user
@staticmethod
def create(id, name, email, profile_pic):
db.executeQuery(
'INSERT INTO users (id, name, email, profile_pic) VALUES (%s,%s,%s,%s);', (id, name, email, profile_pic,)
)
Psycopg2 的文档:
https ://www.psycopg.org/docs/usage.html
也许,我对数据库和用户类的设计完全没有了。如果我需要提供更多信息,请随时告诉我!
解决方案
我意识到我以前的数据库类用于executeQuery
所有类型的查询。但我相信这可能是我得到错误结果的原因。我找到了这个链接:Python MySQLdb - Connection in a class。我注意到一个人实现了单独的方法来执行和获取查询,所以我想我会尝试一下,令我惊讶的是,它成功了!所以我重构了我的代码,看起来像这样:
def fetch(self, query, values=None):
cursor = self.connection.cursor()
cursor.execute(query, values)
result = cursor.fetchall()
cursor.close()
return result
def execute(self, query, values=None):
cursor = self.connection.cursor()
cursor.execute(query, values)
self.connection.commit()
cursor.close()
推荐阅读
- node.js - 如何使用 Moment.js 将“2pm”格式化为“2:00 PM”?
- button - 如何为 Leaflet Marker 工具添加带有事件的多个按钮
- php - 在这种情况下如何使用 laravel 6 应用分页
- java - java发送带有附件pdf的电子邮件不起作用
- python - Numba CUDA reduce into array
- c# - EF Core - DbContext.Update 与 DbContext.Entry(exitingEntity).CurrentValues.SetValues(entity);
- reactjs - 打字稿文件夹基础绝对导入
- javascript - 如何垂直居中列表中的最后一项?
- javascript - 如何避免'X'不是node.js中的构造函数错误?
- python - 两行列表元素的阶乘