我通过Postgresql在此数据库下创建了一个名为websites2014
的数据库和三个表cand_elec
,sites
和pages
。我现在正在尝试查询表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的新手。有人可以帮忙吗?谢谢!
以下是我修订的新代码:
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'"]
再次感谢您的帮助!
如下面的答案评论,如果我将代码重写为:
class Pages(Base):
__tablename__ = 'pages'
uuid = Column(String, primary_key=True)
所以班级' name和tablename定义为我在创建表时定义的。它应该工作,错误信息将消失。
答案 0 :(得分:1)
您正在尝试使用查询对象,但似乎您没有创建映射类来实例化它。
您应该声明如下所示的类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()")
)