【问题标题】:How to read data from postgresql in python using Flask and SQLAlchemy?如何使用 Flask 和 SQLAlchemy 从 python 中的 postgresql 读取数据?
【发布时间】:2016-12-05 09:50:59
【问题描述】:

我开始创建一个烧瓶应用程序,因为我需要对最近传输到本地 postgresql 数据库的一些数据进行一些可视化。

我有很多表 (33),它们都具有与当前相同类型的内容,只是用作不同类型数据的容器(尽管它们包含一个 JSON 对象,但每个表中的对象都不同)。

这些表被命名为“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..

在我的终端(Windows cmd)中,我尝试运行以下命令:

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

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

我希望有人能知道为什么会这样?

【问题讨论】:

  • 表中有没有主键为1的记录?
  • 上述命令是否获取行的id?我认为这就像只获得 1 行。但如果它是行的 ID,那么这就是我的问题。我将如何获得“随机”行或随机行子集?
  • 那么我肯定使用了错误的命令。谢谢你通知我。我会马上检查文档;)

标签: python postgresql flask flask-sqlalchemy


【解决方案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>

【讨论】:

    【解决方案2】:

    如您的回答中所述,您需要使用firts() 方法。另一种选择是将您的查询限制如下:

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

    这样您就不需要过滤器,只需检索查询中的第一项(这似乎是您最初想要使用 query.get(1) 做的事情

    请参阅here 了解更多信息。

    【讨论】:

      【解决方案3】:

      这个 sloution 使用 postgres 和 Flask,没有 SQLAlchemy

      @app.route('/contextget', methods=['GET']) 
      def contextget():
          sql_query ="""SELECT * FROM context"""
          out = cur.execute(sql_query)
          context_records = cur.fetchall() 
          ContextRootKeys = []
          outp ="Print each row and it's columns values"
          for row in context_records:
              ContextRootKeys.append(row[1])
          conn.commit()
          print(ContextRootKeys)
          return outp
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-08-13
        • 1970-01-01
        • 2014-07-15
        • 2020-12-28
        • 2019-05-31
        • 1970-01-01
        • 2021-09-24
        相关资源
        最近更新 更多