Ошибка программирования: ("SQL содержит 1 маркер параметра, но было предоставлено 2 параметра", "HY000")
При запуске приведенного ниже сценария он заканчивается следующей ошибкой, так как я нахожу другие сообщения об этой ошибке, но я не нахожу исправления, аналогичные моему сценарию. Спасибо за помощь!
*Traceback (most recent call last):
File "D:\DVO\Bo\Marketing Hours\archive\active_assets.py", line 9, in <module>
r"D:\User folders\VOD_Titles\BCST_assets.txt"
File "D:\DVO\Bo\Marketing Hours\archive\seac_assets.py", line 67, in main
assets = [asset_record(*row) for results in mssql_query(connect_string, sql_string, [today_string, today_string]) for row in results]
File "D:\DVO\Bo\Marketing Hours\archive\seac_assets.py", line 67, in <listcomp>
assets = [asset_record(*row) for results in mssql_query(connect_string, sql_string, [today_string, today_string]) for row in results]
File "D:\DVO\Bo\Marketing Hours\archive\seac_assets.py", line 24, in mssql_query
db_cursor.execute(sql_string, vars)
pyodbc.ProgrammingError: ('The SQL contains 1 parameter markers, but 2 parameters were supplied', 'HY000')*
Это основной скрипт, вызывающий seac_assets
import seac_assets
if __name__ == "__main__":
online = True
if online:
seac_assets.main(
"DRIVER={SQL Server};SERVER=172.18.192.68;DATABASE=IdwData;UID=suddenlink;PWD=5udd3nlink",
r"D:\User folders\VOD_Titles\BCST_assets.txt"
)
seac_assets.main(
"DRIVER={SQL Server};SERVER=172.19.241.51;DATABASE=IdwData;UID=suddenlink;PWD=5udd3nlink",
r"D:\User folders\VOD_Titles\CHRM_assets.txt"
)
Это реальный код, использующий pyodbc, который заканчивается ошибкой
import pyodbc
import csv
from collections import defaultdict, namedtuple
from datetime import datetime, timedelta
asset_record = namedtuple("asset_record", """\
wuid,
name,
title_brief,
activate_date,
deactivate_date""")
def mssql_query(connect_string,
sql_string,
vars=None,
TIMEOUT_VALUE=300,
FETCH_ROWS=5000,
MAX_ROWS=10 ** 6):
# Set up the database connection and cursor
db_conn = pyodbc.connect(connect_string, timeout=TIMEOUT_VALUE)
db_cursor = db_conn.cursor()
# Execute the passed SQL statements
db_cursor.execute(sql_string, vars)
r = [] # Holds one batch of results
L = 0
while True:
r = db_cursor.fetchmany(FETCH_ROWS)
if r == []: # fetchmany() returns [] when finished
break
L += len(r)
if L > MAX_ROWS:
print(">>Fetched more than ", MAX_ROWS, ", aborting.")
break
yield r
print("Fetched {} rows".format(L))
print(">>Finished fetching rows.")
#End the database connection and return the results
db_cursor.close()
db_conn.close()
def main(connect_string, outfile_path):
sql_string = """\
SELECT
ref.WUID,
ref.Name,
a.TitleBrief,
dates.ActivateDate,
dates.DeactivateDate
FROM
dbo.WHIDS_Asset AS ref WITH (NOLOCK)
LEFT JOIN dbo.WHIDS_ATitleBrief AS a WITH (NOLOCK)
ON ref.WUID = a.WUID
LEFT JOIN dbo.WHIDS_AActivateDeactivateDates AS dates WITH (NOLOCK)
ON ref.WUID = dates.WUID
WHERE
dates.DeactivateDate >= ?
AND a.TitleBrief IS NOT NULL
ORDER BY
dates.DeactivateDate"""
today = datetime.today()
today_string = today.strftime("%Y-%m-%d")
print (asset_record)
assets = [asset_record(*row) for results in mssql_query(connect_string, sql_string, [today_string, today_string]) for row in results]
print (assets)
with open(outfile_path, "w") as outfile:
print("WUID",
"NAME",
"TITLE_BRIEF",
"ACTIVATE_DATE",
"DEACTIVATE_DATE",
sep='\t',
file=outfile)
for a in assets:
print(a.wuid,
a.name,
a.title_brief,
a.activate_date.strftime("%Y-%m-%d %H:%M"),
a.deactivate_date.strftime("%Y-%m-%d %H:%M"),
sep='\t',
file=outfile)
1 ответ
Решение
Ну, ошибка говорит о том, что у вас есть один маркер параметра и два параметра. Я смотрю на ваш sql:
SELECT
ref.WUID,
ref.Name,
a.TitleBrief,
dates.ActivateDate,
dates.DeactivateDate
FROM
dbo.WHIDS_Asset AS ref WITH (NOLOCK)
LEFT JOIN dbo.WHIDS_ATitleBrief AS a WITH (NOLOCK)
ON ref.WUID = a.WUID
LEFT JOIN dbo.WHIDS_AActivateDeactivateDates AS dates WITH (NOLOCK)
ON ref.WUID = dates.WUID
WHERE
dates.DeactivateDate >= ?
AND a.TitleBrief IS NOT NULL
ORDER BY
dates.DeactivateDate
Я вижу один маркер параметра (?
в вашем пункте, где).
Когда я смотрю на место, где вы отправляете запрос:
mssql_query(connect_string, sql_string, [today_string, today_string])
Я вижу, как вы передаете две копии today_string
в качестве параметров. Как и в сообщении об ошибке: один маркер параметра, два параметра. Попробуйте изменить запрос на
mssql_query(connect_string, sql_string, [today_string])