python - 从交互式控制台运行代码时无法访问数据库

标签 python google-app-engine flask sqlalchemy flask-sqlalchemy

# main.py

from flask import Flask, jsonify
from flask.ext.cors import CORS
from shared.database import db
from src import controllers
import os

app = Flask(__name__)
cors = CORS(app, allow_headers='Content-Type')

app.register_blueprint(controllers.api)

if (os.getenv('SERVER_SOFTWARE') and os.getenv('SERVER_SOFTWARE').startswith('Google App Engine/')):
    app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+gaerdbms:///gaiapro_api_dev?instance=dev-gaiapro-api:gaiapro-sql'
else:
    app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+mysqldb://root@127.0.0.1/gaiapro_api_dev'
    app.config['DEBUG'] = True

db.init_app(app)

# shared/database.py

from flask.ext.sqlalchemy import SQLAlchemy
db = SQLAlchemy()

# src/controllers/__init__.py

from flask import Blueprint, jsonify, request
from src import models
from src import views
from shared.helpers import *

api = Blueprint('api', __name__)

@api.route('/test')
def test():
  ...

# shared/helpers.py

from flask import jsonify, request, abort, make_response
from shared.database import db

def some_method():
    ...
    db.session.commit() # Can access db normally from here

# src/models/__init__.py

from shared.database import db

class Client(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    ...

我正在为 GAE(Google App Engine)开发。基本上,我想要的是在 _dev_appserver.py_ 的 Admin Server 中的 Interactive Console 中测试我的模型。

我尝试从交互式控制台运行以下代码:

from main import *
from src import models
print models.Client.query.get(1)

结果是:

RuntimeError:应用程序未在数据库实例上注册并且没有应用程序绑定(bind)到当前上下文

如果我尝试在此上下文中打印 db 变量,结果是:SQLAlchemy engine=None

我不知道我做错了什么。我的代码在浏览器上正常运行,但我无法从交互式控制台让它运行。

最佳答案

您需要在 app context 中(或请求上下文)以访问应用程序绑定(bind)对象。

实现此目的的一种简单方法是使用 Flask-Script ,它提供了一个 shell 命令来为您设置应用程序。或者使用 Flask's integration with Click如果您使用的是开发版。

要让它立即运行,请自己设置上下文:

ctx = app.app_context()
ctx.push()
# do stuff
ctx.pop()
# quit

您还可以在 with block 中使用上下文:

with app.app_context():
    # do stuff

关于python - 从交互式控制台运行代码时无法访问数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27949056/

相关文章:

python - 没有唯一列的透视数据框

python - 运行服务器的 flask 应用程序

flask - 为什么Flask session 的值必须是JSON可序列化的?

python - 使用 gunicorn 使 python Flask 应用程序可以从 Internet 访问

python - Django:同一浏览器中的两个 session

python - UsersConfig()函数中的ready()函数是什么?

java - 在测试中模拟可变网络条件

google-app-engine - 从已部署的应用连接到 Google Cloud SQL 服务器时遇到问题

google-app-engine - 我应该把站点地图放在 Appengine 的什么位置?

python - Kivy 侧边栏加上内容布局