2017-09-23 8 views
0

websites2014というデータベースと、Postgresqlを使用してこのデータベースの下に3つのテーブルcand_elecsitespagesというデータベースを作成しました。私は今テーブルpagesを照会しようとしており、その列の1つであるuuidでフィルタリングしていますが、動作しません。以下のコードである:それは動作しませんSQLAlchemyクエリ/フィルタが機能しない

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

私は、コードを変更した場合:次の行までの作業罰金以上

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() 

私はPostgresqlとSQLAlchemyの新機能です。誰も助けることができますか?ありがとう!


EDIT以下は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

ありがとうございました!しかし、私はまだ少し混乱しています。あなたのコードによると、私は既にテーブルとその中の列を作成していても、私はまだこれらの2つを自分のコードで再び定義しなければならないようです。 Btw、最後の行 'test = pages.filter_by(uuid =" 1234 ")。first()'はまだ動作せず、元の投稿にエラーメッセージを入れます。 – tzu

+0

@Tzu tablenameを残念に思いますが、それはもちろん__tablename__ = 'page''です – PRMoureu

+0

あなたのデータベースの 'uuid'のタイプをチェックできますか?整数か文字列ですか? – PRMoureu

関連する問題