[英]django // Raw query must include the primary key
蟒蛇 3.6
Django 2.2.3
玛丽亚数据库
我正在使用 Django 开发一个显示各种统计信息的 Web 程序。
通过“inspectdb”从现有的 MariaDB 数据库创建“models.py”。
由于来自多个表的混合查询,我正在尝试使用“原始”查询
但是,会发生以下错误。
django.db.models.query_utils.InvalidQuery: Raw query must include the primary key
Mariadb 表
# table : user
uid(int(10), primary, auto_increment)
email(varchar(100))
created_at(timestamp)
# table : user_logs
seq(int(11), primary, auto_increment)
uid(int(10))
acct_type(tinyint(2))
log_type(varchar(20))
created_at(timestamp)
#query
SELECT
years,
months,
sum(download) AS download,
sum(countin) AS user_regist,
sum(countout) AS user_login
FROM (
SELECT
YEAR(DATE_ADD(created_at, INTERVAL 9 HOUR)) AS years,
MONTH(DATE_ADD(created_at, INTERVAL 9 HOUR)) AS months,
count(1) AS `countin`,0 AS `countout`, 0 AS 'download'
FROM user `in`
WHERE (
DATE_ADD(created_at, INTERVAL 9 HOUR) >= '2019-09-01 00:00:00' AND
DATE_ADD(created_at, INTERVAL 9 HOUR) < '2020-01-20 00:00:00')
GROUP BY `years`, `months`
UNION
SELECT
YEAR(DATE_ADD(created_at, INTERVAL 9 HOUR)) AS years,
MONTH(DATE_ADD(created_at, INTERVAL 9 HOUR)) AS months,
0 `countin`,
count(1) AS `countout`,
0 AS 'download'
FROM user_logs `out`
WHERE (
acct_type = 1 AND
log_type = 'login' AND
DATE_ADD(created_at, INTERVAL 9 HOUR) >= '2019-09-01 00:00:00' AND
DATE_ADD(created_at, INTERVAL 9 HOUR) < '2020-01-20 00:00:00')
GROUP BY `years`, `months`
) `regist_and_login_monthly`
GROUP BY years, months;
查询结果
模型.py
class User(models.Model):
uid = models.AutoField(primary_key=True)
email = models.CharField(max_length=100, blank=True, null=True)
created_at = models.DateTimeField(blank=True, null=True)
class Meta:
managed = False
db_table = 'user'
ordering = ['-created_at']
class UserLogs(models.Model):
seq = models.AutoField(primary_key=True)
uid = models.PositiveIntegerField(primary_key=True)
acct_type = models.IntegerField(blank=True, null=True)
log_type = models.CharField(max_length=20, blank=True, null=True)
created_at = models.DateTimeField(blank=True, null=True)
class Meta:
managed = False
db_table = 'user_logs'
ordering = ['-created_at']
视图.py
# same as query
user_monthly_status = User.objects.raw(
'''
SELECT
years,
months,
sum(download) AS download,
sum(countin) AS user_regist,
sum(countout) AS user_login
FROM (
SELECT
YEAR(DATE_ADD(created_at, INTERVAL 9 HOUR)) AS years,
MONTH(DATE_ADD(created_at, INTERVAL 9 HOUR)) AS months,
count(1) AS `countin`,0 AS `countout`, 0 AS 'download'
FROM user `in`
WHERE (
DATE_ADD(created_at, INTERVAL 9 HOUR) >= '2019-09-01 00:00:00' AND
DATE_ADD(created_at, INTERVAL 9 HOUR) < '2020-01-20 00:00:00')
GROUP BY `years`, `months`
UNION
SELECT
YEAR(DATE_ADD(created_at, INTERVAL 9 HOUR)) AS years,
MONTH(DATE_ADD(created_at, INTERVAL 9 HOUR)) AS months,
0 `countin`,
count(1) AS `countout`,
0 AS 'download'
FROM user_logs `out`
WHERE (
acct_type = 1 AND
log_type = 'login' AND
DATE_ADD(created_at, INTERVAL 9 HOUR) >= '2019-09-01 00:00:00' AND
DATE_ADD(created_at, INTERVAL 9 HOUR) < '2020-01-20 00:00:00')
GROUP BY `years`, `months`
) `regist_and_login_monthly`
GROUP BY years, months;
'''
)
当我搜索此错误时,人们说在每个“选择”中放置“1 作为 id”或“每个表的主列”,但发生了相同的错误。
我该怎么办?
一旦我填写了问题,我就会解决它并分享结果。
来自https://docs.djangoproject.com/en/2.2/topics/db/sql/#deferring-model-fields 的提示
我在每个“选择”中添加了一个“表”的“PK 列”,并将其中一个放入第一个“选择”中。
user_monthly_status = User.objects.raw(
'''
SELECT
uid, # add !!!!!!!
years,
months,
sum(download) AS download,
sum(countin) AS user_regist,
sum(countout) AS user_login
FROM (
SELECT
uid,# add !!!!!!!
YEAR(DATE_ADD(created_at, INTERVAL 9 HOUR)) AS years,
MONTH(DATE_ADD(created_at, INTERVAL 9 HOUR)) AS months,
count(1) AS `countin`,0 AS `countout`, 0 AS 'download'
FROM user `in`
WHERE (
DATE_ADD(created_at, INTERVAL 9 HOUR) >= '2019-09-01 00:00:00' AND
DATE_ADD(created_at, INTERVAL 9 HOUR) < '2020-01-20 00:00:00')
GROUP BY `years`, `months`
UNION
SELECT
seq,# add !!!!!!!!
YEAR(DATE_ADD(created_at, INTERVAL 9 HOUR)) AS years,
MONTH(DATE_ADD(created_at, INTERVAL 9 HOUR)) AS months,
0 `countin`,
count(1) AS `countout`,
0 AS 'download'
FROM user_logs `out`
WHERE (
acct_type = 1 AND
log_type = 'login' AND
DATE_ADD(created_at, INTERVAL 9 HOUR) >= '2019-09-01 00:00:00' AND
DATE_ADD(created_at, INTERVAL 9 HOUR) < '2020-01-20 00:00:00')
GROUP BY `years`, `months`
) `regist_and_login_monthly`
GROUP BY years, months;
'''
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.