我正在使用Flask和SQLAlchemy开发一个项目。我已经成功创建了我的数据库并用数据填充了它。现在,我正在使用蓝图处理API端点。但是,我想在这里使用原始SQL查询而不是SQLAlchemy提供的ORM(这是项目的要求)。但是,当我从我的db对象检索引擎并运行查询时,它访问了错误的数据库,结果返回了错误的数据。它访问的数据库实际上是默认的postgres数据库,其中一个关系标题为用户名为postgres的单个用户。
但是,当我使用ORM运行查询时,它会访问正确的数据库并执行正确的查询。我已经研究了一段时间了,并没有得到任何答案。这是我的项目的目录结构
.
├── api
│ ├── __init__.py
│ ├── models.py
│ └── views
│ ├── auth.py
│ └── users.py
├── db_create.py
├── db_drop.py
├── manager.py
├── populate.py
├── README.md
以下是无法正常工作 users.py文件:
import json
from api import app, db
from api.models import User
from flask import Blueprint, request
from flask import jsonify
import api
mod = Blueprint('users', __name__)
engine = db.engine
conn = engine.connect()
@mod.route('/users')
def get_all_users():
result = conn.execute("SELECT * FROM user")
users = []
for row in result:
user = {}
for key in row.keys():
user[key] = row[key]
users.append(user)
return jsonify({'users' : users})
这是工作用户.py:
import json
from api import app, db
from api.models import User
from flask import Blueprint, request
from flask import jsonify
import api
mod = Blueprint('users', __name__)
engine = db.engine
conn = engine.connect()
@mod.route('/users')
def get_all_users():
users = db.session.query(User).all()
users_arr = []
for user in users:
user_dict = {}
user_dict["email"] = user.email
user_dict["username"] = user.username
user_dict["password"] = user.password
user_dict["name"] = user.name
user_dict["latitude"] = user.latitude
user_dict["longitude"] = user.longitude
users_arr.append(user_dict)
return jsonify({'users' : users_arr})
我在models.py中定义了我的数据库模型,并且我使用这种(非常粗略的)在db_create.py中实例化数据库的方式:
from api import db
db.create_all()
db.session.commit()
这是api目录中的 init .py:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_cors import CORS
from flask_login import LoginManager, login_required
import os
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = "postgresql://postgres:postgres@localhost/mydbname"
db = SQLAlchemy(app)
from api import models
# import and register blueprints
from api.views import users
app.register_blueprint(users.mod)
即使我尝试从psql访问用户关系,它也无法正常工作。它返回一个带有postgres的1元组作为用户。但是,从psql访问其他关系工作正常(我认为这表明它们适用于SQLAlchemy中的原始SQL)。
psql CLI的Pastebin:https://pastebin.com/raw/gPyr4Hbk
但是,如果我通过DataGrip之类的东西检查数据库,它会正确报告用户关系并正确显示数据。