亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Postgresql 和 Psycopg2 無法正確選擇兩個日期之間的數據

Postgresql 和 Psycopg2 無法正確選擇兩個日期之間的數據

慕后森 2023-02-15 16:51:05
我創建了一個 API 服務,它以 JSON 形式返回股票代碼、匯率和日期,但是當我嘗試選擇多個參數時,它無法正常工作,就像這里的示例一樣,假設end_at=2010-05-10和start_at= 2010-05-15:數據庫模型:class Currency(Base):   __tablename__ = "currency"   ticker = Column(String)   date = Column(Date)   rates = Column(JSONB, primary_key=True)更新了 Mike Orgenek 的回答中的查詢代碼:if end_at and start_at:        currency = cursor.execute("""        SELECT rates,date,ticker        FROM currency        WHERE ticker = %s        AND date BETWEEN SYMMETRIC %s AND %s """, (base, start_at, end_at, ))start_at打印= 2010-05-10& end_at=的查詢后2010-05-15Out: 2020-07-04T09:32:30.898337+00:00 app[web.1]: b"\n        SELECT rates,date,ticker\n        FROM currency\n        WHERE ticker = 'EUR'\n        AND date BETWEEN SYMMETRIC '2010-05-10' AND '2010-05-15' "start_at即使使用正確的查詢FULL API 輸出,它也無法識別我的參數它包括早于start_at類似"2010-01-28", "2010-01-07","2010-04-16"
查看完整描述

1 回答

?
拉丁的傳說

TA貢獻1789條經驗 獲得超8個贊

請參數化您的查詢以避免 SQL 注入攻擊。


if end_at and start_at:

     currency = cursor.execute("""SELECT rates,date,ticker 

     FROM currency

     WHERE ticker = %s 

     AND date BETWEEN SYMMETRIC %s AND %s """, (base, start_at, end_at, ))

     print(cursor.query)  # <--- This should log the complete query sent to the db server

要診斷手頭的問題,請執行類似這樣的操作以查看您發送的內容,但在將所有調用更改為參數化形式之前不要讓您的應用程序生效。execute()


if end_at and start_at:

     query = f"""SELECT rates,date,ticker 

                   FROM currency

                  WHERE ticker = '{base}' 

                    AND date BETWEEN SYMMETRIC '{start_at}' AND '{end_at}' """

     print(query)

     currency = cursor.execute(query)


在修復您的查詢以使用參數后,要查看查詢中發送到服務器的內容,請使用 作為LoggingConnection您現有的替代品psycopg2.Connection,如從我如何使用 Psycopg2 的 LoggingConnection 中提取的?.


import logging

import psycopg2

from psycopg2.extras import LoggingConnection


logging.basicConfig(level=logging.DEBUG)

logger = logging.getLogger(__name__)


conn=psycopg2.connect(connection_factory=LoggingConnection, database='some_database')

conn.initialize(logger)


c = conn.cursor()


c.execute("select count(*) from some_table where id > %s", (1000, ))

使用我的基本配置,日志記錄進入控制臺:


DEBUG:__main__:b'select count(*) from some_table where id > 1000'


查看完整回答
反對 回復 2023-02-15
  • 1 回答
  • 0 關注
  • 107 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號