gpt4 book ai didi

python - Django update() 交换 MySQL 中两个字段的值?

转载 作者:行者123 更新时间:2023-11-29 04:36:42 27 4
gpt4 key购买 nike

以下不起作用:

Car.objects.filters(<filter>).update(x=F('y'), y=F('x'))

因为 xy 最终都是相同的值。

由于性能(大量记录),我需要使用 update() 而不是 save()。

是否有任何其他方法可以像上面那样进行更新以模仿 Python 的 x, y = y, x

数据库是 MySQL,which might explain why the resulting SQL statement doesn't work .

最佳答案

如果您使用的是符合标准的正确 SQL 数据库,这应该可以正常工作。查询将扩展为

UPDATE car SET x = y, y = x WHERE <filter>

它至少可以在 PostgreSQL 上正常工作(也在下方),SQLite3(下方),OracleMSSQL ,但是 MySQL 实现已损坏。

PostgreSQL:

select * from car;
x | y
---------+------
prefect | ford
(1 row)

test=> update car set x = y, y = x;
UPDATE 1
test=> select * from car;
x | y
------+---------
ford | prefect
(1 row)

SQLite3

sqlite> select * from foo;
prefect|ford
sqlite> update foo set x = y, y = x;
sqlite> select * from foo;
ford|prefect

但是,MySQL违反了SQL标准,

mysql> insert into car values ('prefect', 'ford');
Query OK, 1 row affected (0.01 sec)

mysql> select * from car;
+---------+------+
| x | y |
+---------+------+
| prefect | ford |
+---------+------+
1 row in set (0.00 sec)

mysql> update car set x = y, y = x;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> select * from car;
+------+------+
| x | y |
+------+------+
| ford | ford |
+------+------+
1 row in set (0.00 sec)

因此,有一种可移植的方法可以使用符合标准的 SQL 数据库来执行此操作,但 MySQL 不是其中之一。如果您不能使用 for ... save 循环,那么您必须求助于 Swapping column vales in MySQL 中的一些技巧。 ;临时变量似乎是最通用的;尽管我不确定您是否可以将临时变量与 Django 的 F 结构一起使用。

关于python - Django update() 交换 MySQL 中两个字段的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39505586/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com