【问题标题】:SqlAlchemy query result outputtingSqlAlchemy 查询结果输出
【发布时间】:2017-09-09 02:49:33
【问题描述】:

我正在尝试使用 Python 3 中的 SqlAlchemy 查询我的 Postgres 数据库中的一个表。它可以正常运行查询,但是当我遍历 SqlAlchemy 返回的结果中的每一行时,我尝试使用属性“文本” (我的列名之一)。我收到此错误:

'str' object has no attribute 'text'

我已经打印了这样的属性:

for row in result:
   print(row.text)

这不会给出错误。产生错误的代码如下。但是,给我的环境:

我有两台服务器正在运行。一个用于我的数据库,另一个用于我的 python 服务器。

数据库服务器:

  • Postgres v9.6 - 在亚马逊的 RDS 上

使用 Python 的服务器

  • Linux 3.13.0-65-generic x86_64 - 在 Amazon EC2 实例上
  • SqlAlchemy v1.1.5
  • Python v3.4.3
  • Flask 0.11.1

相关文件:

import sqlalchemy as sa
from sqlalchemy.ext.automap import automap_base
from sqlalchemy.orm import Session
import re
from nltk import sent_tokenize

class DocumentProcess:
  def __init__(self):
    ...
    Engine = sa.create_engine(
        CONFIG.POSTGRES_URL,
        client_encoding='utf8',
        pool_size=20,
        max_overflow=0
    )

    # initialize SQLAlchemy
    Base = automap_base()

    # reflect the tables
    Base.prepare(Engine, reflect=True)

    # Define all needed tables
    self.Document = Base.classes.documents

    self.session = Session(Engine)
    ...

  def process_documents(self):
    try:
        offset = 5
        limit = 50
        ###### This is the query in question ##########
        result = self.session.query(self.Document) \
            .order_by(self.Document.id) \
            .offset(offset) \
            .limit(limit)
        for row in result:
          # The print statement below does print out the text
          print(row.text)
          # when passing document.text to sent_tokenize, it
          # gives the following error:
          # 'str' object has no attribute 'text'
          snippets = sent_tokenize(row.text.strip('\n')) # I have removed strip, but the same problem
    except Exception as e:
        logging.info(format(e))
        raise e

这是我的文档模型,在我的 PostgreSQL 数据库中:

class Document(db.Model):
    __tablename__ = "documents"

    id = db.Column(db.Integer, primary_key=True)
    text = db.Column(db.Text)
    tweet = db.Column(db.JSON)
    keywords = db.Column(db.ARRAY(db.String), nullable=True)

    def to_dict(self):
        return dict(
            id=self.id,
            text=self.text,
            tweet=self.tweet,
            keywords=self.keywords
        )

    def json(self):
        return jsonify(self.to_dict())

    def __repr__(self):
        return "<%s %r>" % (self.__class__, self.to_dict())

我尝试过的事情

  1. 以前,我在文档查询中没有order_by。这是以前的工作。但是,即使删除 order_by 也无法解决问题。

  2. 使用 SELECT 语句并手动查看结果,但结果仍然相同

我没有尝试过的

  1. 我想知道是不是因为我将列命名为“文本”。我注意到,当我在 postgres 中写出这个查询时,它会将其突出显示为保留字。我很困惑为什么我的查询以前有效,但现在它不起作用。会不会是这个问题?

非常感谢您对此问题的任何想法。

【问题讨论】:

  • 如果你在for循环中写了两次print(row.text)会发生什么?我认为 sqlalchemy 返回一个迭代器。
  • 我以三种不同的方式打印了 3 次,如下所示:print(row.text)print(str(row.text))my_text = row.text 然后将 my_text 传递给函数并打印它。每一个都完美地打印了row.text(都在for循环中)

标签: python postgresql amazon-ec2 flask-sqlalchemy


【解决方案1】:

如果您正在创建外部表并且列数据类型之一是text,您可能会在 PostgreSQL 中收到此错误。改成character varying(),错误消失!

【讨论】:

    【解决方案2】:

    原来text是PostgreSQL中的保留字。我重命名了列名并重构了我的代码以匹配。这解决了问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-07
      • 1970-01-01
      • 1970-01-01
      • 2019-08-17
      • 1970-01-01
      • 2015-07-12
      相关资源
      最近更新 更多