使用SqlAlchemy,是否可以构建一个只更新第一个匹配行的查询?
就我而言,我需要更新最新的日志条目:
class Log(Base):
__tablename__ = 'logs'
id = Column(Integer, primary_key=True)
#...
analyzed = Column(Boolean)
session.query(Log) \
.order_by(Log.id.desc()) \
.limit(1) \
.update({ 'analyzed': True })
Run Code Online (Sandbox Code Playgroud)
结果如下:
InvalidRequestError:调用limit()时无法调用Query.update()
这是有道理的,因为它UPDATE ... LIMIT 1是一个仅限MySQL的功能(这里给出了解决方案)
但是我如何对PostgreSQL做同样的事情呢?可能,使用子查询方法?
我需要一种更有效的方法来更新 Postgres 9.5 中单个表的行。我目前正在使用 pg_dump 执行此操作,并在 Linux 操作系统环境中的搜索和替换操作后使用更新的值重新导入。
table_a有 300000 行,2 列:id bigint和json_col jsonb.
json_col有大约 30 个键:“C1”到“C30”,如本例所示:
Table_A
id,json_col
1 {"C1":"Paris","C2":"London","C3":"Berlin","C4":"Tokyo", ... "C30":"Dallas"}
2 {"C1":"Dublin","C2":"Berlin","C3":"Kiev","C4":"Tokyo", ... "C30":"Phoenix"}
3 {"C1":"Paris","C2":"London","C3":"Berlin","C4":"Ankara", ... "C30":"Madrid"}
...
Run Code Online (Sandbox Code Playgroud)
要求是批量搜索从 C1 到 C30 的所有键,然后在它们中查找值“柏林”并替换为“马德里”,并且仅当马德里不重复时。即 id:1 与密钥 C3,和 id:2 与 C2。id:3 将被跳过,因为 C30 已经存在这个值
它必须在 PostgreSQL 9.5 中的单个 SQL 命令中,一次并考虑jsonb列中的所有键。
我有一个 PostgreSQL 表,其中有一列包含字符串数组。该行有一些唯一的数组字符串,或者一些也有重复的字符串。如果存在,我想从每一行中删除重复的字符串。
我尝试了一些查询,但无法实现。
以下是表格:
veh_id | vehicle_types
--------+----------------------------------------
1 | {"byd_tang","volt","viper","laferrari"}
2 | {"volt","viper"}
3 | {"byd_tang","sonata","jaguarxf"}
4 | {"swift","teslax","mirai"}
5 | {"volt","viper"}
6 | {"viper","ferrariff","bmwi8","viper"}
7 | {"ferrariff","viper","viper","volt"}
Run Code Online (Sandbox Code Playgroud)
我期待以下输出:
veh_id | vehicle_types
--------+----------------------------------------
1 | {"byd_tang","volt","viper","laferrari"}
2 | {"volt","viper"}
3 | {"byd_tang","sonata","jaguarxf"}
4 | {"swift","teslax","mirai"}
5 | {"volt","viper"}
6 | {"viper","ferrariff","bmwi8"}
7 | {"ferrariff","viper","volt"}
Run Code Online (Sandbox Code Playgroud) 使用 Postgres 13.1,我想对表的所有列应用前向填充函数。前向填充函数在我之前的问题中进行了解释:
但是,在这种情况下,列和表是指定的。我想获取该代码并将其应用于任意表,即。指定一个表,并将前向填充应用于每一列。
以此表为例:
CREATE TABLE example(row_num int, id int, str text, val integer);
INSERT INTO example VALUES
(1, 1, '1a', NULL)
, (2, 1, NULL, 1)
, (3, 2, '2a', 2)
, (4, 2, NULL, NULL)
, (5, 3, NULL, NULL)
, (6, 3, '3a', 31)
, (7, 3, NULL, NULL)
, (8, 3, NULL, 32)
, (9, 3, '3b', NULL)
, (10,3, NULL, NULL)
;
Run Code Online (Sandbox Code Playgroud)
我从该函数的以下工作基础开始。我称之为传递一些变量名。请注意,第一个是表名而不是列名。该函数获取表名并创建所有列名的数组,然后输出名称。
create or replace function col_collect(tbl text, …Run Code Online (Sandbox Code Playgroud) 我正在尝试清除过多的尾随零,我使用了以下查询...
UPDATE _table_ SET _column_=trim(trailing '00' FROM '_column_');
Run Code Online (Sandbox Code Playgroud)
...我收到以下错误:
错误:列"_column_"的表达式是text类型.
我已经玩过引号,因为它通常是文本与数字相比,虽然没有任何运气.
该CREATE TABLE语法:
CREATE TABLE _table_ (
id bigint NOT NULL,
x bigint,
y bigint,
_column_ numeric
);
Run Code Online (Sandbox Code Playgroud) 我有一个mysql命令:
update table_demo SET flag= 1 where flag=0 ORDER BY id ASC LIMIT 10
Run Code Online (Sandbox Code Playgroud)
并且需要在 Postgres 中使用相同的命令,我收到此错误:
错误:语法错误位于或附近
'ORDER'
这是我所遇到的问题的简化,但是使用这个例子我想获得给定客户的所有产品记录.给客户可能有很多订单,一些订单可能是同一产品我不想拉回重复的产品.产品表上还有一个复合键.
在一个理想的世界中,这很简单,下面的Query将完成这项工作.但是,由于该表包含nText列,因此SQL Server会抱怨"无法将ntext数据类型选为DISTINCT,因为它不具有可比性."
SELECT distinct p.idA, p.idB, p.descriptionNTEXT
FROM p product, o order, c customer
WHERE o.productID = p.idA AND o.subProductID = p.idB AND o.customerID = c.ID
Run Code Online (Sandbox Code Playgroud)
我想把它重新组织成类似的东西
SELECT p1.idA, p1.idB, p1.descriptionNTEXT
FROM p1 product
WHERE (p1.idA, p1.idB) IN
(
SELECT p.idA, p.idB
FROM p product, o order, c customer
WHERE o.productID = p.idA AND o.subProductID = p.idB AND o.customerID = c.ID
)
Run Code Online (Sandbox Code Playgroud)
但是,此方法不适用于SQL Server
有任何想法吗?
理想情况下,我需要一个可移植的解决方案,至少可以在SQLServer,MySQL和Oracle上运行.但DB Specific解决方案总比没有好!
以下数据大致显示了我想要的内容.
Customer
ID name
1 Fred
Order
ID CustomerID productID …Run Code Online (Sandbox Code Playgroud) 使用Postgres我有一个有conversations和的模式conversationUsers.每个conversation都有很多conversationUsers.我希望能够找到具有确切指定数量的对话conversationUsers.换句话说,提供了一个userIds(例如[1, 4, 6])我希望能够找到仅包含那些用户的对话的数组,而不是更多.
到目前为止,我试过这个:
SELECT c."conversationId"
FROM "conversationUsers" c
WHERE c."userId" IN (1, 4)
GROUP BY c."conversationId"
HAVING COUNT(c."userId") = 2;
Run Code Online (Sandbox Code Playgroud)
不幸的是,这似乎也回归了包括这两个用户在内的对话.(例如,如果对话还包括"userId"5 ,则返回结果).
我有一个 Postgres 表,对多个列有唯一约束,其中一列可以为 NULL。我只希望每个组合都允许该列中的一条记录为 NULL。
create table my_table (
col1 int generated by default as identity primary key,
col2 int not null,
col3 real,
col4 int,
constraint ux_my_table_unique unique (col2, col3)
);
Run Code Online (Sandbox Code Playgroud)
我有一个 upsert 查询,当它遇到 col2、col3 中具有相同值的记录时,我想更新 col4:
insert into my_table (col2, col3, col4) values (p_col2, p_col3, p_col4)
on conflict (col2, col3) do update set col4=excluded.col4;
Run Code Online (Sandbox Code Playgroud)
但当 col3 为 NULL 时,冲突不会触发。我读过有关使用触发器的内容。请问,引发冲突的最佳解决方案是什么?
我正在尝试从oracle DB中的表中进行选择.
如果我在单列上的select语句中做了不同的工作,它可以正常工作,但对于多列,这似乎不起作用.
例如.
select DISTINCT col1, col2, col3, col4, col5, col6 from table1
Run Code Online (Sandbox Code Playgroud)
返回相同的结果.
select * from table1
Run Code Online (Sandbox Code Playgroud)
第2列,第3列具有重复值.我想要的是所有上述列值的值,但不是column2和column3的重复值.
你能帮忙吗?我们将不胜感激.
谢谢
postgresql ×8
sql ×8
sql-update ×4
null ×2
select ×2
arrays ×1
distinct ×1
duplicates ×1
dynamic-sql ×1
jsonb ×1
mysql ×1
oracle ×1
plpgsql ×1
python ×1
replace ×1
sequelize.js ×1
sql-limit ×1
sql-server ×1
sqlalchemy ×1
unique ×1
upsert ×1