我正在尝试使用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())
我尝试过的事情
之前,我在Document查询中没有order_by
。这之前有用。但是,即使删除order_by
也不再修复它。
使用SELECT语句并手动完成结果,但结果仍然相同
我没有尝试过
对此问题的任何想法都将不胜感激。
答案 0 :(得分:0)
事实证明text
是PostgreSQL中的保留字。我重命名了列名并重构了我的代码以匹配。这解决了这个问题。
答案 1 :(得分:0)
如果要创建外表并且其中一个列数据类型为text
,则可能会在PostgreSQL中出现此错误。将其更改为character varying()
,错误消失!