programing

매개 변수가 있는 Pandas read_sql

easyjava 2023. 9. 16. 10:04
반응형

매개 변수가 있는 Pandas read_sql

Pandas에서 SQL 쿼리로 매개 변수를 전달하는 방법에 대한 예가 있습니까?

특히 SQLAlchemy 엔진을 사용하여 Postgre와 연결하고 있습니다.SQL 데이터베이스.지금까지 저는 다음과 같은 효과가 있다는 것을 알았습니다.

df = psql.read_sql(('select "Timestamp","Value" from "MyTable" '
                     'where "Timestamp" BETWEEN %s AND %s'),
                   db,params=[datetime(2014,6,24,16,0),datetime(2014,6,24,17,0)],
                   index_col=['Timestamp'])

팬더 문서에 의하면params명령어로도 전달할 수 있지만, 예를 들어 시도해본 결과 이를 작동시킬 수 없는 것 같습니다.

df = psql.read_sql(('select "Timestamp","Value" from "MyTable" '
                     'where "Timestamp" BETWEEN :dstart AND :dfinish'),
                   db,params={"dstart":datetime(2014,6,24,16,0),"dfinish":datetime(2014,6,24,17,0)},
                   index_col=['Timestamp'])

팬더에서 이러한 쿼리를 실행하는 데 권장되는 방법은 무엇입니까?

read_sql의사들은 이것을 말합니다.params인수는 목록, 튜플 또는 dict가 될 수 있습니다(문서 참조).

sql 쿼리의 값을 전달하기 위해 다음과 같은 다양한 구문이 있습니다.?,:1,:name,%s,%(name)s(PEP249 참조).
그러나 모든 데이터베이스 드라이버가 이러한 모든 가능성을 지원하는 것은 아니며, 사용 중인 드라이버에 따라 구문이 지원됩니다(psycopg2자네의 경우에는.)

두 번째 경우에는 dict를 사용할 때 '이름이 지정된 인수'를 사용합니다.psycopg2문서화, 그들은 지원합니다.%(name)s스타일(따라서 그렇지 않음):name아마도), http://initd.org/psycopg/docs/usage.html#query-parameters 를 참조하십시오.
따라서 이러한 스타일을 사용하면 효과가 있습니다.

df = psql.read_sql(('select "Timestamp","Value" from "MyTable" '
                     'where "Timestamp" BETWEEN %(dstart)s AND %(dfinish)s'),
                   db,params={"dstart":datetime(2014,6,24,16,0),"dfinish":datetime(2014,6,24,17,0)},
                   index_col=['Timestamp'])

SQLite Table에서 읽을 때 많은 매개 변수를 전달하는 데 문제가 있었습니다.그리고 당신이 그에게 줄을 건네줬기 때문에 밝혀졌습니다.read_sql, 그냥 f-string을 사용하시면 됩니다.MSSQL pyodbc에서도 동일하게 시도해보았고 그것은 또한 작동합니다.

SQLite의 경우 다음과 같습니다.

# write a sample table into memory
from sqlalchemy import create_engine
df = pd.DataFrame({'Timestamp': pd.date_range('2020-01-17', '2020-04-24', 10), 'Value1': range(10)})
engine = create_engine('sqlite://', echo=False)
df.to_sql('MyTable', engine);

# query the table using a query
tpl = (1, 3, 5, 8, 9)
query = f"""SELECT Timestamp, Value1 FROM MyTable WHERE Value1 IN {tpl}"""
df = pd.read_sql(query, engine)

매개 변수가 datetime이면 좀 복잡하지만 사용 중인 SQL 방언의 datetime 변환 기능을 호출하면 됩니다.

start, end = '2020-01-01', '2020-04-01'
query = f"""SELECT Timestamp, Value1 FROM MyTable WHERE Timestamp BETWEEN STRFTIME("{start}") AND STRFTIME("{end}")"""
df = pd.read_sql(query, engine)

언급URL : https://stackoverflow.com/questions/24408557/pandas-read-sql-with-parameters

반응형