使用Flask的SQLAlchemy无法连接到数据库以进行原始SQL查询?

时间:2018-03-20 22:57:40

标签: python postgresql flask sqlalchemy flask-sqlalchemy

我正在使用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之类的东西检查数据库,它会正确报告用户关系并正确显示数据。

Screenshot of DataGrip

1 个答案:

答案 0 :(得分:0)

Postgres drop table syntax error

User是Postgres中的关键字。要正确访问关系,请用引号括起来。