You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Flask中SQLAlchemy执行原生SQL提示user_event_details表不存在

解决Flask-SQLAlchemy执行原生SQL提示表不存在的问题

嘿,我一眼就揪出问题根源了——你收到的错误是sqlite3.OperationalError: no such table: user_event_details,这说明你的Flask应用连接的是SQLite数据库,而不是你在psql里操作的PostgreSQL!那个user_event_details表只存在于你的PostgreSQL实例中,SQLite里没有这个表,自然会报错。

第一步:检查并修正数据库连接配置

你需要确认Flask的SQLALCHEMY_DATABASE_URI配置项,是不是不小心写成了SQLite的格式,而不是PostgreSQL的连接字符串。

  • SQLite的连接格式(你现在可能误用的):
    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///your_local_db.db'
    
  • PostgreSQL的正确连接格式:
    # 替换成你的PostgreSQL用户名、密码、主机、端口和数据库名
    app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://postgres:your_password@localhost:5432/your_target_db'
    

第二步:验证数据库连接类型

可以加一段简单的代码,确认当前连接的数据库类型:

from sqlalchemy import create_engine
from flask import Flask

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://...'  # 填入你正确的连接字符串
engine = create_engine(app.config['SQLALCHEMY_DATABASE_URI'])

# 打印数据库方言名称,正常应该输出postgresql而不是sqlite
print(engine.dialect.name)

第三步:正确执行原生SQL查询

确保你用绑定了PostgreSQL连接的SQLAlchemy会话来执行查询,示例代码如下:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
# 配置正确的PostgreSQL连接
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://postgres:your_password@localhost:5432/your_db_name'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False  # 关闭不必要的修改跟踪
db = SQLAlchemy(app)

# 在应用上下文内执行查询
with app.app_context():
    try:
        # 小优化:你的SQL里distinct(user_id)和GROUP BY user_id功能重复,GROUP BY已经会返回唯一user_id,可简化
        query = """
            SELECT user_id 
            FROM user_event_details 
            WHERE age >=19 
              AND granular_timestamp >=1493596800 
              AND granular_timestamp <=1517356800 
              AND event_name ='IB_TRANS' 
            GROUP BY user_id;
        """
        result = db.session.execute(query)
        user_ids = [row[0] for row in result.fetchall()]
        print(user_ids)
    except Exception as e:
        db.session.rollback()
        print(f"查询出错:{e}")

额外小提示

你的SQL语句里distinct(user_id)GROUP BY user_id功能重复了,因为GROUP BY user_id本身就会返回每个唯一的user_id,所以可以去掉distinct,让查询更简洁。

内容的提问来源于stack exchange,提问作者Aman Singh

火山引擎 最新活动