2016-07-05 5 views
1

私はCanariフレームワークを使用して、Malteog内で一連の変換を作成してMySQLデータベースをスキャンし、結果をエンティティとして返します。SQLのフィールドでpython変数が含まれているかどうかを調べる

私は、SQLステートメント内のLIKE演算子を操作する全体を持っています。コードは次のとおりです。

#=========================================================================== 
# Request and set target from graph 

target = (request.entity.value) 

#=========================================================================== 
# Extract message column and check against target entity 

statement = (
    "SELECT * FROM tableT.TTO WHERE Text LIKE %(tq)s" 
) 

cursor.execute(statement, { 'tq': target }) 

results = cursor.fetchall() 

#=========================================================================== 
# Create response entities based on SQL output 

for r in results: 

    e = getTTO(target) 
    e.From = r[0] 
    e.Text = r[1] 
    e.date = r[2] 
    e.iconurl = 'http://local.paterva.com/phrase.png' 
    response += e 

これは機能しますが、正確な一致が返されます。 TEXT列をチェックして、エントリに変数 "target"の記述が含まれているかどうかを確認する必要があります。私は一日のうちにpython変数を渡すのに一番の時間を費やしましたが、完全一致以外のものを返すことはできません。

+0

あなたはおそらく、[全文検索]を探しています(http://dev.mysql.com/doc/refman/5.7/en/fulltext- natural-language.html)。 – syntonym

答えて

0

SQL LIKE演算子は、値の前後に特別な「ワイルドカード」マーカー(MySQLでは「%」)を必要とします(「開始」、「終了」または「含む」検索に応じて)。あなたは、あなたの引数の周りすなわち、これらのワイルドカードを追加する必要があります。

cursor.execute(statement, {'tq': "%{}%".format(target)}) 

cursor.fetchall()MemoryErrorを求めている、メモリにあなたの全体の結果セットをロードすることに注意してください。 cursorオブジェクトは、反復可能オブジェクトであり、それは彼らにその方法を使用するほうが安全です:

cursor.execute(statement, {'tq': "%{}%".format(target)}) 
for row in cursor: 
    do_something_with(row) 
+0

私は見る!どうもありがとう。私はSQLで多くの時間を費やしていないので、ちょうどナットとボルトに入っています。ほとんどのプロジェクトと同様に、「学習時間」のためのスペースはありません。 Thatsはそれをクリアしました。素晴らしいもの。 –

関連する問題