Postgresql 和 Psycopg2 无法正确 select 两个日期之间的数据
Postgresql & Psycopg2 unable to properly select data between two dates
我创建了一个 API 服务,returns 代码、费率和日期为 JSON,但是当我尝试 select 多个参数时,它没有t 正常工作就像这里是一个例子,假设 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-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'
我创建了一个 API 服务,returns 代码、费率和日期为 JSON,但是当我尝试 select 多个参数时,它没有t 正常工作就像这里是一个例子,假设 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-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'