2013-04-14 67 views
0

我想在使用瓶和sqlalchemy的heroku上設置一個簡單的服務器,但我不斷收到錯誤信息,因爲「db」關鍵字沒有被注入,所以我沒有給出足夠的參數。 這是我試過的:在Heroku上使用SQLAlchemy瓶

import os 
from bottle import * 
import bottle 
from bottle.ext import sqlalchemy 
from sqlalchemy import create_engine, Column, Integer, Sequence, String 
from sqlalchemy.ext.declarative import declarative_base 
import json 

app = bottle.Bottle() 
database_url = os.environ["DATABASE_URL"] 

Base = declarative_base() 
engine = create_engine(database_url, echo=True) 

plugin = sqlalchemy.Plugin(
     engine, 
     Base.metadata, 
     keyword='db', 
     create=True, 
     commit=True, 
     use_kwargs=False 
) 

app.install(plugin) 

class Path(Base): 
    __tablename__ = "path" 
    id = Column(Integer, Sequence("id_seq"), primary_key=True) 
    start_node = Column(String) 
    end_node = Column(String) 
    path = Column(String) 

    def __init__(self, start_node, end_node, path): 
     self.start_node = start_node 
     self.end_node = end_node 
     self.path = path 

    def __repr__(self): 
     return "<Path(id: '%d', start_node: '%s', end_node: '%s', path: '%s')>" & (self.id, self.start_node, self.end_node, self.path) 

@app.get("/get", db) 
def node_value(db): 
    node = "face" 
    start_path = db.query(Path).filter_by(start_node=node) 
    end_path = db.query(Path).filter_by(end_node=node) 
    if start_path and end_path: 
     data = start_node 
     data.append(end_path) 
    if start_path: 
     return start_node 
    if end_path: 
     return end_path 
    else: 
     return "ERROR" 


@route("/") 
def hello_world(): 
    return "Hello, World!" 

run(host="0.0.0.0", port=int(os.environ.get("PORT", 3000))) 

感謝您的幫助!

+0

從裝飾器中取出'db'參數。 – Blender

+0

糟糕。那是我測試隨機的東西。我這樣做,並將裝飾器改回到'@route(「/ get」)'。但我仍然得到同樣的錯誤。它說,它收到0個參數,但期待1. – babaloo

+0

我想你還需要在'hello_world()'的參數中加入'db'。 – Blender

回答

0

我跑你的代碼,它爲我工作。我唯一改變的事情似乎跟你形容爲你的經驗是什麼不一致的,但也許他們會幫助:

  1. app.get裝飾刪除了db PARAM。
  2. 您需要致電您的應用程序的運行方法,而不是瓶子的。即

所以這兩條線路從:更改

@app.get("/get", db) 
... 
run(host="0.0.0.0", port=int(os.environ.get("PORT", 3000))) 

@app.get("/get") 
... 
app.run(host="0.0.0.0", port=int(os.environ.get("PORT", 3000))) 

然後按預期工作。如果這些更改無法解決您的問題,請準確地發佈您正在做什麼來生成錯誤消息以及該消息是什麼,然後我會看看是否可以在我的最終版本上進行復制。

PS,當我說「爲我的作品,」我的意思是node_value方法被調用,每原來問:我不是說這實際上確實什麼。 :)哦,僅供參考我也將DATABASE_URL設置爲「sqlite:///:memory:」