Postgresql 和 Psycopg2 无法正确 select 两个日期之间的数据

Postgresql & Psycopg2 unable to properly select data between two dates

我创建了一个 API 服务,returns 代码、费率和日期为 JSON,但是当我尝试 select 多个参数时,它没有t 正常工作就像这里是一个例子,假设 end_at = 2010-05-10start_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-15

的查询后
Out: 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 Output

它包括早于 start_at 的日期,例如 "2010-01-28""2010-01-07""2010-04-16"

请参数化您的查询以避免 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 的替代品,如从How do I use Psycopg2's 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'