2017-03-18 9 views
-2

私はPythonでSqlalchmeyについて質問があります。 私は、以下のようにクエリメソッドを使用してクエリ操作を行うことができます。 フィルタ値上記のように> User.id - -SQLAlchemyメソッドのフィルタ条件としてパラメータを渡す方法

session.query(User).filter(User.id == 0).first() 

しかし、私はより一般的なやりたいが、例えば、私は、テーブル名、フィルタエレメント、データを照会するためのフィルタ値、 フィルタエレメントを渡すことができます> 0

しかし、私は照会するUser.filter_elementを使用している場合、Pythonは

AttributeError: type object 'User' has no attribute 'filter_element' 

だからそこに誰かが私には方法を見つけるのを助けるために警告しますか?

PS>私は事を行うためにsql.execute()を使うことができると知っていますが、誰もsqlalchemyを使用してSQL文を使用する考えはありますか?

ありがとう〜

答えて

0

ご利用いただけます。 declarative_baseおよびfilter_by

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

engine = create_engine('sqlite:///test.db', convert_unicode=True) 
db_session = scoped_session(sessionmaker(autocommit=False, 
             autoflush=False, 
             bind=engine)) 
Base = declarative_base() 
Base.query = db_session.query_property() 


class User(Base): 
    __tablename__ = 'users' 
    id = Column(Integer, primary_key=True) 
    name = Column(String(50), unique=True) 

    def __init__(self, name=None): 
     self.name = name 

    def __repr__(self): 
     return '<User %r>' % (self.name) 

Base.metadata.create_all(bind=engine) 
db_session.add(User('name1')) 
db_session.commit() 

User.query.filter_by(name='name1').first() # => <User u'name1'> 
1

このビットを使用すると、柔軟にクエリを生成できます。

In [2]: User.email 
Out[2]: <sqlalchemy.orm.attributes.InstrumentedAttribute at 0x7f42cd4b7410> 

In [3]: User.email == '' 
Out[3]: <sqlalchemy.sql.elements.BinaryExpression object at 0x7f42ca640550> 

In [4]: User.email.in_([]) 
...warning 
Out[4]: <sqlalchemy.sql.elements.BinaryExpression object at 0x7f42c9e07710> 

あなたは行うことができます

user_attribute = getattr(User, 'email') # get attribute 
if equals_filter: 
    user_filter = user_attribute == equals_value # compute expression 
else: 
    user_filter = user_attribute.in_(in_list) 
users = session.query(User).filter(user_filter) # filter using expression 
関連する問題