Python SqlAlchemy查询结果输出
我正在尝试使用Python3中的SqlAlchemy查询Postgres数据库中的一个表。它可以很好地运行查询,但是当我遍历SqlAlchemy返回的结果中的每一行时,我尝试使用属性“text”(我的一个列名)。我收到这个错误: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) 这并没有给出错误。下面是产生错误的代码。然而,为了给我的环境: 我有两台服务器在运行。一个用于我
'str' object has no attribute 'text'
我打印了如下属性:
for row in result:
print(row.text)
这并没有给出错误。下面是产生错误的代码。然而,为了给我的环境:
我有两台服务器在运行。一个用于我的数据库,另一个用于我的python服务器
数据库服务器:
-在亚马逊的RDS上Postgres v9.6
-在Amazon EC2实例上Linux 3.13.0-65-generic x86_64
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
。这是以前的工作。然而,即使通过删除订单_,也无法修复它
对此问题的任何想法都将不胜感激。事实证明,
text
在PostgreSQL中是一个保留字。我重命名了列名并重构了代码以匹配。这就解决了问题。如果您正在创建一个外部表,并且其中一个列数据类型是text
,则在PostgreSQL中可能会出现此错误。将其更改为字符变化()
,错误就会消失 如果在for循环中写入两次print(row.text)
,会发生什么?我认为sqlalchemy返回一个迭代器。我用三种不同的方式打印了三次:print(row.text)
,print(str(row.text))
,my_text=row.text
然后将my_text
传递到函数中并打印它。每个打印的行.文本都非常完美(都在for循环中)