''.join()
никоим образом не изменяет порядок. Если вы получили другой порядок, тогда запрос базы данных создал строки в другом порядке.
Я не думаю, что вы сообщаете базе данных, чтобы заказывать ваши результаты по дате. Вы заказываете по style112
, и база данных может свободно заказывать значения с одинаковым значением столбца style112
в любом порядке, который им нравится. Если style112
не содержит информацию о дате (как год, месяц, последовательность дней фиксированной длины) и порядок дат, сообщите базе данных о правильном порядке! Здесь это будет year, month, day
, по крайней мере, .
Я также реорганизую код, чтобы избежать квадратичного поведения производительности; выражение inset = inset + [....]
должно каждый раз создавать новый объект списка, копируя все элементы из inset
и новый список. При добавлении N элементов в список таким образом, Python должен выполнить N * N шагов. Для 1000 элементов это 1 миллион шагов для выполнения! Используйте list.append()
, чтобы добавить отдельные элементы, что уменьшит рабочую нагрузку до примерно N шагов.
Вы можете прокручивать курсор непосредственно над курсором; это более эффективно, так как он может буферизовать строки, здесь cursor.fetchone()
не может предположить, что вы получите больше данных. Цикл for row in cursor:
также более читабельен.
Вы также можете использовать форматирование строки , а не конкатенацию строк, это поможет избежать всех этих вызовов str()
и избыточности, поскольку а также дальнейшее снижение проблем с производительностью; все эти конкатенации строк также создают и воссоздают много промежуточных строковых объектов, которые вам вообще не нужно создавать.
Поэтому используйте это:
cnxn = pyodbc.connect(
'DRIVER={ODBC Driver 13 for SQL Server};SERVER=MYVM\SQLEXPRESS;'
'DATABASE=MyTables;UID=test;PWD=t')
cursor = cnxn.cursor()
cursor.execute('''
DECLARE @today as date
SET @today = GetDate()
SELECT
style112, day, month, year, dayofweek, showroom_name, isbusy
from ShowroomCal
where Date Between @today and dateadd(month,1,@today)
order by year, month, day, style112
''')
inset = []
for row in cursor:
inset.append(
''
''
'{r.day}'.format(r=row))
with open(r"C:\tes.html") as template:
template = f.read()
html = template.format(inset=''.join(inset))
with open(r"C:\inetpub\wwwroot\cal\tes.html", 'w') as output:
output.write(html)
Примечание: если ваши данные в базе данных были введены вашими пользователями, вы должны убедиться, что данные правильно экранированы для включения в HTML в первую очередь , или вы оставите себя открытыми для XSS межсайтовые скриптовые атаки . Лично я использовал бы механизм шаблонов HTML с поддержкой escaping по умолчанию, например Jinja .