输出

时间:2017-04-13 05:54:28

标签: python postgresql amazon-ec2 flask-sqlalchemy

我正在尝试使用Python 3中的SqlAlchemy在我的Postgres数据库中查询我的一个表。它运行查询正常但是当我浏览SqlAlchemy返回的结果中的每一行时,我尝试使用属性&#39 ;文本' (我的一个专栏名称)。我收到此错误:

'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数据库中的Document模型:

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. 之前,我在Document查询中没有order_by。这之前有用。但是,即使删除order_by也不再修复它。

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

  3. 我没有尝试过

    1. 我想知道是不是因为我将列命名为&#39; text&#39;。我注意到,当我在postgres中编写此查询时,它会将其突出显示为保留字。我很困惑为什么我的查询之前有效,但现在它不起作用。这可能是问题吗?
    2. 对此问题的任何想法都将不胜感激。

2 个答案:

答案 0 :(得分:0)

事实证明text是PostgreSQL中的保留字。我重命名了列名并重构了我的代码以匹配。这解决了这个问题。

答案 1 :(得分:0)

如果要创建外表并且其中一个列数据类型为text,则可能会在PostgreSQL中出现此错误。将其更改为character varying(),错误消失!