首页 > 解决方案 > 使用烧瓶登录 - 插入后无法使用 SELECT 从 Postgres 获取数据

问题描述

所以我正在尝试使用 OAuth、Flask 和 Postgres 创建一个身份验证系统。我不太确定我的代码发生了什么。我为数据库创建了一个类,该类将容纳连接并在进行查询时创建游标。我还为用户创建了一个类,它将发送要在数据库类上执行的查询。

这就是我想要做的:

我尝试遵循一些资源来解决此问题:

不知道出了什么问题。我在终端上打开了 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

也许,我对数据库和用户类的设计完全没有了。如果我需要提供更多信息,请随时告诉我!

标签: pythonpostgresqlflaskpsycopg2

解决方案


我意识到我以前的数据库类用于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() 

推荐阅读