Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SqlAlchemy查询结果输出_Python_Postgresql_Amazon Ec2_Flask Sqlalchemy - Fatal编程技术网

Python SqlAlchemy查询结果输出

Python SqlAlchemy查询结果输出,python,postgresql,amazon-ec2,flask-sqlalchemy,Python,Postgresql,Amazon Ec2,Flask Sqlalchemy,我正在尝试使用Python3中的SqlAlchemy查询Postgres数据库中的一个表。它可以很好地运行查询,但是当我遍历SqlAlchemy返回的结果中的每一行时,我尝试使用属性“text”(我的一个列名)。我收到这个错误: 'str' object has no attribute 'text' 我打印了如下属性: for row in result: print(row.text) 这并没有给出错误。下面是产生错误的代码。然而,为了给我的环境: 我有两台服务器在运行。一个用于我

我正在尝试使用Python3中的SqlAlchemy查询Postgres数据库中的一个表。它可以很好地运行查询,但是当我遍历SqlAlchemy返回的结果中的每一行时,我尝试使用属性“text”(我的一个列名)。我收到这个错误:

'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
  • pythonv3.4.3
  • 烧瓶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())
类文档(db.Model):
__tablename=“文档”
id=db.Column(db.Integer,主键=True)
text=db.Column(db.text)
tweet=db.Column(db.JSON)
关键字=db.Column(db.ARRAY(db.String),nullable=True)
def到dict(自身):
返回指令(
id=self.id,
text=self.text,
tweet=self.tweet,
关键词=self.keywords
)
def json(self):
返回jsonify(self.to_dict())
定义报告(自我):
返回“%”(self.\uuuuu类\uuuuuu,self.to\u dict())
我尝试过的事情

  • 以前,我在文档查询中没有
    order\u by
    。这是以前的工作。然而,即使通过删除
    订单_,也无法修复它

  • 使用SELECT语句并手动检查结果,但结果仍然相同

  • 我没有尝试过的

  • 我想知道这是否是因为我将列命名为“text”。我注意到,当我在postgres中写下这个查询时,它突出显示为一个保留字。我不明白为什么我的查询以前有效,但现在无效。这可能是问题所在吗

  • 对此问题的任何想法都将不胜感激。

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

    如果您正在创建一个外部表,并且其中一个列数据类型是
    text
    ,则在PostgreSQL中可能会出现此错误。将其更改为
    字符变化()
    ,错误就会消失

    如果在for循环中写入两次
    print(row.text)
    ,会发生什么?我认为sqlalchemy返回一个迭代器。我用三种不同的方式打印了三次:
    print(row.text)
    print(str(row.text))
    my_text=row.text
    然后将
    my_text
    传递到函数中并打印它。每个打印的
    行.文本
    都非常完美(都在for循环中)