join & amp; поведение f.write не так, как ожидалось

Попробуйте вместо этого обработать PreviewKeyUp (или KeyUp). Если это не сработает, то ваше окно или код должно быть больше (обрабатываете ли вы другие экземпляры этих событий)?

0
задан Martijn Pieters 13 July 2018 в 10:29
поделиться

1 ответ

''.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(
        '<div class="{r.isbusy}">'
        '<a href="#" id="{r.style112}"'
        ' onclick="parent.updateField(field38, {r.style112});">'
        '{r.day}</a></div>'.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 .

2
ответ дан Martijn Pieters 17 August 2018 в 13:15
поделиться
  • 1
    style112 - это форматированная версия даты, которая представляет собой 20180713, но я возьму остальную часть вашего ответа и буду работать с ней, поскольку она кажется более элегантным и потенциально идеальным решением (плюс, какой вред может быть сделан при заказе к дате даже больше)? – C-Sway 13 July 2018 в 10:56
  • 2
    @ C-Sway: право, это не было ясно из контекста. :-) Да, style112 является строкой в ​​формате YYYYMMDD, тогда для этого достаточно should . – Martijn Pieters♦ 13 July 2018 в 11:04
  • 3
    Это сработало фантастически. В конце концов, порядок работал хорошо с только столбцом Style112, как и было предсказано, поэтому я предполагаю, что должно было быть что-то о том, как работает цикл while, который собирал даты в неправильном порядке. – C-Sway 13 July 2018 в 14:08
Другие вопросы по тегам:

Похожие вопросы: