SQLAlchemy查询/过滤器不起作用

时间:2017-09-23 08:39:42

标签: python postgresql sqlalchemy

我通过Postgresql在此数据库下创建了一个名为websites2014的数据库和三个表cand_elecsitespages。我现在正在尝试查询表pages并按其uuid列之一进行过滤,但它不起作用。以下是代码:

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:passwd@localhost: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:passwd@localhost: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'"]

再次感谢您的帮助!

编辑2

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

class Pages(Base):
    __tablename__ = 'pages'

    uuid =  Column(String, primary_key=True)

所以班级' name和tablename定义为我在创建表时定义的。它应该工作,错误信息将消失。

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分:0)

您没有正确使用uuid。 请遵循以下声明。

from sqlalchemy.dialects.postgresql import UUID

...

    uuid = db.Column(
        UUID(as_uuid=True),
        nullable=False,
        index=True,
        unique=True,
        server_default=text("uuid_generate_v4()")
    )