Выход из дословных строковых литералов

Хорошо, благодаря комментариям @SergeyPugach, я сделал следующее:

Добавил сигнал post_save, который вызывает функцию, которая добавляет задачу к сельдерею. apply_async давайте передадим eta - расчетное время прибытия, которое может принять DateTimeField напрямую, это очень удобно.

# models.py
from django.db.models import signals
from django.db import models
from .tasks import send_notification

class Notification(models.Model):
    ...
    notify_on = models.DateTimeField()


def notification_post_save(instance, *args, **kwargs):
    send_notification.apply_async((instance,), eta=instance.notify_on)


signals.post_save.connect(notification_post_save, sender=Notification)

И фактическое задание в tasks.py

import logging
from user_api.celery import app
from django.core.mail import send_mail
from django.template.loader import render_to_string


@app.task
def send_notification(self, instance):
    try:
        mail_subject = 'Your notification.'
        message = render_to_string('notify.html', {
            'title': instance.title,
            'content': instance.content
        })
        send_mail(mail_subject, message, recipient_list=[instance.user.email], from_email=None)
    except instance.DoesNotExist:
        logging.warning("Notification does not exist anymore")

Я не буду вдаваться в подробности установки сельдерея, там много информации.

Теперь я попытаюсь выяснить, как обновить задачу после обновления экземпляра уведомления, но это совсем другая история.

7
задан Oak Bytes 9 July 2012 в 17:23
поделиться

7 ответов

Проблема состоит в том, что не все строки, которые Вы связываете, являются дословными строковыми литералами, только первая часть конкатенации.

Другими словами,

@"SELECT value1, '"

единственный дословный литерал во всем операторе для создания заключительной строки.

Необходимо было бы добавить перед остальной частью строк для создания их всех verbatim.

Который заставил бы его быть похожим:

String formLookupPull = @"SELECT value1, '"+tableName+ @"', '"+columnName+ @"' FROM lkpLookups WHERE ""table"" = '" + tableName + @"' and ""field"" = '" + columnName + @"';";
6
ответ дан 6 December 2019 в 05:08
поделиться

Рассматривать Ваш вопрос заголовка...

Для выхода из кавычки в дословном строковом литерале используйте escape-последовательность кавычки "" (это - два символа кавычки),

string a = @"He said ""Hi!""..."; // He said "Hi!"...

Дополнительную информацию см. в MSDN на выходе и т.д.

Обратите внимание, что в Вашем отправленном коде, единственная дословная строка является самой первой (с @ перед ним). Последующие строки не являются дословными, таким образом, надлежащая escape-последовательность была бы \".

Можно заставить его выглядеть более симпатичным с string.Format:

String formLookupPull = 
   string.Format(@"SELECT value1, '{0}', '{1}' FROM lkpLookups" +
                 @"WHERE ""table"" = '{0}' and ""field"" = '{1}';", 
                 tableName, columnName)
17
ответ дан 6 December 2019 в 05:08
поделиться

Вы хотите использовать \" выйти из кавычек, нет "".

Как это:

.. FROM lkpLookups WHERE \"table\" = '" ..

Править:

Дальнейшее объяснение:

Вы только имеете @ на, в первую очередь, строках Вы конкатенируете. В литеральных строках (с @ впереди), Вы выходите из кавычек с двойной кавычкой. В нормальных строках это - кавычка наклонной черты.

Например.

string s = @"this is a literal string with ""quotes"" in it, " 
         +  "and this is a normal string with \"quotes\" in it";

string t = @"two literal strings" + @", concatenated together.";
5
ответ дан 6 December 2019 в 05:08
поделиться

Много позже Вашего первого конца кавычки символ больше не используется так или иначе, таким образом, Вы свободны использовать символ ESC. Попытайтесь поместить свою "таблицу", перенесенную в' [' как [таблица] и [поле] или выйти из "символа с \.

String formLookupPull = @"SELECT value1, '" + tableName + "', '" + columnName + "' FROM lkpLookups WHERE [table] = '" + tableName + "' and [field] = '" + columnName + "';";
4
ответ дан 6 December 2019 в 05:08
поделиться

Если Вы не можете использовать Параметры SQL, Строку. Формат может быть немного более чистым и читаемым, чем чистый "+ конкатенация".

string formLookupPull = 
  string.Format(@"SELECT value1, '{0}', '{1}' 
                       FROM lkpLookups 
                   WHERE ""table"" = '{0}' AND ""field"" = '{1}';",
                tableName, columnName);
4
ответ дан 6 December 2019 в 05:08
поделиться
String formLookupPull = @"SELECT value1, '"+tableName+"', '"+columnName+"' FROM lkpLookups WHERE \"table\" = '" + tableName + "' and \"field\" = '" + columnName + "';";

Я также полагаю, что Вы выходите из этих переменных правильно прежде, чем создать этот запрос :)

1
ответ дан 6 December 2019 в 05:08
поделиться

Почему Вы заключаете литеральные названия в кавычки столбцов, кажетесь ненужными мне.

"ВЫБЕРИТЕ value1, "+ имя таблицы +"", + columnName +" ОТ lkpLookups ГДЕ таблица = '"+ имя таблицы + "' и поле = '"= columnName +"'";;

Не протестированный, но я думаю, что Вы получите идею.

1
ответ дан 6 December 2019 в 05:08
поделиться
Другие вопросы по тегам:

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