2つのパラメーター(2列)でフィルター処理する必要があるSQLを作成しようとしていますが、2番目の列は複数の値と一致する必要があります。
以下に私がこれまでに構築したSQLを示します(Martijn Pietersの助けに感謝します)
import psycopg2
import pandas as pd
import datetime
# Connecting to db
con = psycopg2.connect(db_details)
cur = con.cursor()
cur.execute("select * from sales limit 10")
rows = cur.fetchall()
params = {'earliest': datetime.datetime.today() - datetime.timedelta(days=7),
'store_name': 'store_1', 'store_2'}
df = pd.read_sql("""
select store_name,count(*) from sales
where created_at >= %(earliest)s
and store_name = %(store_name)s""",
params=params, con=con)
上記のSQLには、where句で使用される日付パラメータが1つあり、さらに1つのパラメータ、つまりstore_nameを追加しました。ここで、行は2つの値のいずれかに一致します。
この追加パラメータを既存のクエリに追加する方法を知りたいです。
パラメータ(日付フィルタと同様)を作成して既存のクエリに渡そうとしましたが、2つの値を指定すると構文エラーが発生します。
'store_name': 'store_1', 'store_2'}
^
SyntaxError: invalid syntax
params
フィールドを指しています。
2つの問題があります。
無効なPython構文を使用しました。辞書のコンマはキーと値のペアを区切るため、'store_2'
文字列は別のキーと値のペアになりますが、: value
部分が欠落しています。複数の文字列で値を定義する場合は、タプルまたはリストを使用する必要があります。明示的に使用するか(...)
、[...]
その構文をkey: value, key: value
表記から分離します。
params = {
'earliest': datetime.datetime.today() - datetime.timedelta(days=7),
'store_name': ('store_1', 'store_2'), # tuple with two values
}
一般的に、SQLパラメータは単一の値でのみ機能します。store_name
パラメータは、単一の値ではなく、値のシーケンスを与えることができます。これは、SQLパラメーターがSQLクエリとそのクエリで使用される動的値の間のブリッジであり、パラメーターが個々の動的値のプレースホルダーとして機能するように設計されているためです。
とは言うものの、psycopg2
ライブラリは特にタプルをサポートしていますが、これはほとんどのPythonデータベースライブラリの例外です。
次に、'store_1'
またはのいずれかに一致する行をフィルタリングする場合'store_2'
、正しいSQL構文は、行と括弧で囲まれた2つのstore_name = ...
テストを使用するかOR
(ストア名テストにdate
接続されたテストからその部分を分離するためAND
)、またはを使用することです。store_name IN ('store_1', 'store_2')
。IN
テストは、に記載されている複数の値に対して、列名を比較(...)
括弧。
psycopg2
ここで使用している場合store_name
、タプル値を参照するキーを使用することIN
はできますが、クエリには次のように使用する必要があります。
params = {
'earliest': datetime.datetime.today() - datetime.timedelta(days=7),
'store_name': ('store_1', 'store_2')
}
df = pd.read_sql("""
SELECT store_name, count(*) FROM sales
WHERE created_at >= %(earliest)s
AND store_name IN %(store_name)s""",
params=params, con=con)
別の注記:pd.read_sql()
関数[DBAPI接続を使用する場合はsqliteのみがサポートされることを明示的に示しています](DBAPI2オブジェクトの場合、sqlite3のみがサポートされます):
DBAPI2オブジェクトの場合、sqlite3のみがサポートされます。
あなたはそのようなオブジェクトを使用しています。ほとんどのPythonデータベースアダプタはDBAPI2ライブラリです。DBAPI2は、そのようなライブラリのPython標準です。
代わりに、SQLAlchemy接続文字列を実際に使用する必要があります。データベースにデータを書き戻そうとしないため、コードは機能します。psycopg接続とカーソルオブジェクトはsqlite3ライブラリのバージョンとほぼ互換性がありますが、将来的に問題が発生する可能性があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加