2017-09-23 181 views
0

我已经通过Postgresql在此数据库下创建了一个名为websites2014的数据库和三个表cand_elec,sitespages。我现在试图查询表pages并按其列uuid之一过滤,但它不起作用。下面是代码:SQLAlchemy查询/过滤器不起作用

import sqlalchemy 
from sqlalchemy import create_engine 
from sqlalchemy import Column, String 
from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy.orm import sessionmaker 
from sqlalchemy import inspect 

db_string = "postgres://usr:[email protected]:5432/websites2014" 

db = create_engine(db_string) 
Session = sessionmaker(db) 
session = Session() 

pages = session.query('pages') 

上方做工精细的代码,直到下一行:

test = pages.filter_by("uuid"="1234").first() 

我:

test = pages.filter_by(uuid="1234").first() 

如果我更改代码以它不工作Postgresql和SQLAlchemy的新成员。谁能帮忙?谢谢!


编辑1

下面是我修改后的新代码:

import sqlalchemy 
from sqlalchemy import create_engine 
from sqlalchemy import Column, String 
from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy.orm import sessionmaker 
from sqlalchemy import inspect 

db_string = "postgres://usr:[email protected]:5432/websites2014" 

db = create_engine(db_string) 
Session = sessionmaker(db) 
session = Session() 

Base = declarative_base() 

class Page(Base): 
    __tablename__ = 'polls_question' 

    uuid = Column(String, primary_key=True) 

pages = session.query(Page) 
test = pages.filter_by(uuid=1234).first() 

但是,它给了我一个错误消息:InternalError: (psycopg2.InternalError) current transaction is aborted, commands ignored until end of transaction block [SQL: 'SELECT polls_question.uuid AS polls_question_uuid \nFROM polls_question \nWHERE polls_question.uuid = %(uuid_1)s \n LIMIT %(param_1)s'] [parameters: {'uuid_1': 1234, 'param_1': 1}]

如果我改变最后一行:session.execute("""SELECT * from page WHERE uuid = '1234'""").first()

它显示另一个错误消息:InternalError: (psycopg2.InternalError) current transaction is aborted, commands ignored until end of transaction block [SQL: "SELECT * from page WHERE uuid = '1234'"]

再次感谢您的帮助!


EDIT 2

的答案下面的评论,如果我重写代码为:

class Pages(Base): 
    __tablename__ = 'pages' 

    uuid = Column(String, primary_key=True) 

所以我创建时所定义的类的名称和表名的定义表。它应该工作,错误信息将消失。

回答

1

您正在尝试使用查询对象,但似乎您并未创建映射类来实例化它。

Query documentation

Mapping documentation

你应该声明一个类Page像下面使用该工具:

from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy import Column, Integer, String 
Base = declarative_base() 

class Page(Base): 
    __tablename__ = 'pages' 

    uuid = Column(String, primary_key=True) 

它并不需要在表中定义的所有列,至少主键以及在过滤器中或要创建的输出中使用的列。

然后你可以用它来建立session.query

pages = session.query(Page) 
test = pages.filter_by(uuid="1234").first() 

也许它可以更容易地创建一个简单的SELECT查询语句?

session.execute("""SELECT * from pages WHERE uuid = '1234'""").first() 
+0

感谢您的回应!但是,我仍然有点困惑。根据你的代码,好像我已经事先创建了表格和列,我仍然需要在代码中再次定义这两个表格。顺便说一句,最后一行'test = pages.filter_by(uuid =“1234”)。first()'仍然不起作用,我把错误信息放在我的原始文章中。 – tzu

+0

@Tzu很抱歉关于表名,它是'__tablename__ ='page''当然是 – PRMoureu

+0

你能检查数据库中'uuid'的类型吗?整数或字符串? – PRMoureu