Результат был пустым после необработанных запросов SQL в django, но прямо с тем же sql в mysql db? - PullRequest
0 голосов
/ 30 апреля 2019

Я использую Django для запуска необработанного запроса, но я все время получаю пустой результат, поскольку могу использовать сгенерированный sql с помощью django в mysql db, чтобы получить правильный результат.

необработанный запрос как:

            SmbFbCampaignStatDaily.objects.raw
               (
                """SELECT 
                    async.id AS id,
                    ...
                    async.name AS NAME,
                    async.status AS STATUS,
                    ...
                    async.rule_created AS rule_created,

                    FROM `smb_fb_campaign_async` async 

                    LEFT JOIN 

                    (SELECT 

                    fb_campaign_id,
                    SUM(impressions) AS impressions,
                    SUM(clicks) AS clicks
                    ...

                    FROM `smb_fb_campaign_stat_daily` WHERE  dt BETWEEN %s AND %s  
                    GROUP BY  fb_campaign_id) statistic 

                    ON statistic.fb_campaign_id = async.fb_campaign_id

                    WHERE  async.fb_account_id = %s

                    AND (async.fb_campaign_id LIKE '%%%s%%' OR async.name LIKE "%%%s%%")

                    ORDER BY %s %s""", (start_date, stop_date, account_id, search_field, search_field, order_field, order)
            )

И сгенерированный sql как показано ниже:

# exe_ret = SmbFbCampaignStatDaily.objects.raw('''sql'')
# print(exe_ret)

SQL:


                SELECT
                async.id AS id,
               ...
                async.name AS NAME,
                async.status AS STATUS,
                async.daily_budget AS daily_budget,
                statistic.spend AS spend,
                statistic.clicks AS clicks,
                statistic.impressions AS impressions,
                statistic.spend AS spend,
               ...

                FROM `smb_fb_campaign_async` async

                LEFT JOIN

                (SELECT

                fb_campaign_id,
                SUM(impressions) AS impressions,
                SUM(clicks) AS clicks,
                ...

                FROM `smb_fb_campaign_stat_daily` WHERE  dt BETWEEN "2019-04-29" AND "2019-04-29"  GROUP BY  fb_campaign_id) statistic

                ON statistic.fb_campaign_id = async.fb_campaign_id

                WHERE  async.fb_account_id = "113743809520028"

                AND (async.fb_campaign_id LIKE '%%' OR async.name LIKE "%%")

                ORDER BY id asc

Я могу получить правильный результат, используя genrated sql в mysql db, но в то же время мой rawQueryset всегда был пустым.

print(len(exe_ret ))
# 0

Как я могу заставить его работать правильно?

Любые комментарии приветствуются. Большое спасибо.

Ответы [ 2 ]

1 голос
/ 30 апреля 2019

Вы не можете использовать подстановку параметров внутри существующей строки, подобной этой. Вам нужно будет предварительно обработать ваши переменные. Например:

like_search_field = '%{}%'.format(search_field)

SmbFbCampaignStatDaily.objects.raw
   ("""...
    AND (async.fb_campaign_id LIKE %s OR async.name LIKE %s)

    ORDER BY %s %s""", (start_date, stop_date, account_id, like_search_field, like_search_field, order_field, order)
)
0 голосов
/ 30 апреля 2019

для печати необработанного запроса используйте это: Допустим, у меня есть Модель продукта

q=Product.objects.raw("select.....")
print(q.query)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...