2016-12-05 237 views
0

我开始创建一个烧瓶应用程序,因为我将需要对最近传输到本地postgresql数据库的一些数据进行一些可视化。我有很多表(33),它们都具有与当前相同类型的内容,只是作为不同类型数据的容器(它们包含的JSON对象在每个表中都不相同)。如何使用Flask和SQLAlchemy从python的postgresql读取数据?

这些表被命名为“Table_#”(其中#表示定义的数字子集中的数字)。

models.py

我创建了以下型号:

from sqlalchemy import BigInteger, Column, JSON, Text 
from app import db 

class Table_1(db.Model): 
    __tablename__ = 'table_1' 

    id = db.Column(BigInteger, primary_key=True) 
    did = db.Column(Text) 
    timestamp = db.Column(BigInteger) 
    data = db.Column(JSON) 
    db_timestamp = db.Column(BigInteger) 

    def __repr__(self): 
     return '<1_Data %r>' % (self.did) 

测试,如果我实际上可以从我的PostgreSQL抓一些数据。

__init__.py

from flask import Flask 
from flask_sqlalchemy import SQLAlchemy 

app = Flask(__name__) 
app.config.from_object('config') 
db = SQLAlchemy(app) 

from app import views, models 

config.py

在我config.py我有以下几点:

SQLALCHEMY_DATABASE_URI = "postgresql://<username>:<password>@localhost:5432/backupdata" //Ofc <username> and <password> isn't my credentials.. 

在我的终端(视窗CMD)我试着运行如下:

>python 
>>>from app import db, models 
>>>row = models.Table_1.query.get(1) 

但由于某种原因,当我尝试打印我的行时,没有任何输出。

我希望有人能够知道这是为什么?

+0

你必须在表中的1? – dirn

+0

主键请问上面的命令得到了行的id的记录做什么?我还以为是像只得到1行..但如果这是行的ID那么这就是我的问题,怎么会我得到了一个“随机”行或随机子行? – Zeliax

+1

['get'执行主键查找](http://docs.sqlalchemy.org/en/latest/orm/query.html#sqlalchemy.orm.query。Query.get)。 – dirn

回答

1

我更新了一下我的模型,看看我确实得到了一个特定的行。

from sqlalchemy import BigInteger, Column, JSON, Text 
from app import db 

class Table_1(db.Model): 
    __tablename__ = 'table_1' 

    id = db.Column(BigInteger, primary_key=True) 
    did = db.Column(Text) 
    timestamp = db.Column(BigInteger) 
    data = db.Column(JSON) 
    db_timestamp = db.Column(BigInteger) 

    def __repr__(self): 
     return '<1_Data %r, %r>' % (self.did, self.id) 

然后下面的查询让我意识到实际上通过我的烧瓶应用程序有一个到SQLAlchemy的工作连接。

row = models.Table_910.query.filter_by(did='357139052424715').first() 

知道我有上面没有我能得到一个项目一个项目:

<1_Data '357139052424715', 738390911> 
0

正如你的答案说,你就需要使用firts()方法。另一种选择是限制你的查询,如下所示:

Table.query.limit(1).all()

这样,你不需要一个过滤器,可以直接检索查询的第一个项目(这似乎是你想要最初做什么与query.get(1)

更多信息,请参见here

相关问题