2017-09-23 178 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