【发布时间】: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.5Python v3.4.3Flask 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())
我尝试过的事情
以前,我在文档查询中没有
order_by。这是以前的工作。但是,即使删除order_by也无法解决问题。使用 SELECT 语句并手动查看结果,但结果仍然相同
我没有尝试过的
- 我想知道是不是因为我将列命名为“文本”。我注意到,当我在 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