我在PostgreSQL 9.5中有以下UPSERT:
INSERT INTO chats ("user", "contact", "name")
VALUES ($1, $2, $3),
($2, $1, NULL)
ON CONFLICT("user", "contact") DO NOTHING
RETURNING id;
Run Code Online (Sandbox Code Playgroud)
如果没有冲突,则返回如下内容:
----------
| id |
----------
1 | 50 |
----------
2 | 51 |
----------
Run Code Online (Sandbox Code Playgroud)
但如果存在冲突,则不会返回任何行:
----------
| id |
----------
Run Code Online (Sandbox Code Playgroud)
id如果没有冲突,我想返回新列,或者返回id冲突列的现有列.
可以这样做吗?如果是这样,怎么样?
好的,所以我不是那种经验丰富的Python.
我有以下Python代码:
cursor.execute("INSERT INTO table VALUES var1, var2, var3,")
Run Code Online (Sandbox Code Playgroud)
where var1是整数,var2&var3是字符串.
如何在没有python的情况下编写变量名,包括它们作为查询文本的一部分?
我在PostgreSQL中有一个简单的表,它有三列:
我已经在SO上看到了这个问题:插入,在PostgreSQL中重复更新?但我想知道如果它存在,如何获取id,而不是更新.如果标准做法是始终"插入"或"如果存在则更新",为什么会这样?SELECT(LIMIT 1)的成本是否高于UPDATE?
我有以下代码
INSERT INTO tag
("key", "value")
SELECT 'key1', 'value1'
WHERE
NOT EXISTS (
SELECT id,"key","value" FROM tag WHERE key = 'key1' AND value = 'value1'
);
Run Code Online (Sandbox Code Playgroud)
它的工作原理是它不存在,如果存在,但我想获得id.是否有"RETURNING id"条款或类似的东西,我可以在那里点击?
我想写一个Postgres SQL语句,说明寻找具有颜色X和亮度Y的用户.如果该用户存在,则返回其所有行数据.如果没有,请创建一个新行并传递其他信息.这两个单独的陈述会做这样的事情:
Select (color, brightness, size, age) FROM mytable WHERE color = 'X' AND brightness= 'Y';
Run Code Online (Sandbox Code Playgroud)
如果这不返回任何内容,则执行以下命令:
INSERT INTO mytable (color, brightness, size, age) VALUES (X, Y, big, old);
Run Code Online (Sandbox Code Playgroud)
有没有办法将这些组合成一个查询?
我对 python 有一些经验,但对 SQL 很陌生,并尝试使用 pandas.to_sql 将表数据添加到我的数据库中,但是当我添加时,我希望它在追加之前检查数据是否存在
这是我的 2 个数据框
>>> df0.to_markdown()
| | Col1 | Col2 |
|---:|-------:|-------:|
| 0 | 0 | 00 |
| 1 | 1 | 11 |
>>> df1.to_markdown()
| | Col1 | Col2 |
|---:|-------:|-------:|
| 0 | 0 | 00 |
| 1 | 1 | 11 |
| 2 | 2 | 22 |
Run Code Online (Sandbox Code Playgroud)
所以这里我使用pandas to_sql
>>> df0.to_sql(con=con, name='test_db', if_exists='append', index=False)
>>> df1.to_sql(con=con, name='test_db', if_exists='append', index=False)
Run Code Online (Sandbox Code Playgroud)
在这里我检查数据库文件中的数据
>>> df_out = …Run Code Online (Sandbox Code Playgroud) 我需要检查是否存在行.如果它不存在,则应插入.
这是在postgres,我试图通过shell脚本插入行.当我运行脚本时,它不显示错误,但即使没有匹配的行,它也不会插入到表中.
正如在此指出的那样,可以使用postgresql 9.1+进行以下操作
INSERT INTO example_table
(id, name)
SELECT 1, 'John'
WHERE
NOT EXISTS (
SELECT id FROM example_table WHERE id = 1
);
Run Code Online (Sandbox Code Playgroud)
我一直在玩sqlalchemy的0.9版本,他们从SELECT方法引入了INSERT,理论上应该处理上述问题.
有可能,如果可能,怎么样?(因为我想利用在使用原始sql时不返回的result.inserted_primary_key)
我如何使用bindparams作为'from_select'部分,因为我可以使用它的唯一方法是在select中使用表列.
例如
insrt = example_table.insert().
from_select(['id', 'name'],
example_table.select().
where(~exists(select([example_table.c.id],
example_table.c.id == 1))))
result = session.execute(insrt)
if result.is_insert:
print 'do something with result.inserted_primary_key'
Run Code Online (Sandbox Code Playgroud) 我是SQL的新手,我得到的只是错误后的错误,所以任何帮助都将不胜感激.
我有一个标签表:id,name,slug
我已经谷歌了,在Stackoverflow上搜索过,但没有什么对我有用.我正在尝试创建一个标签,如果它不存在,但总是返回ID,无论它是创建还是存在.
INSERT INTO tags (name, slug)
SELECT ('Wow', 'wow')
WHERE NOT EXISTS (SELECT id FROM tags WHERE slug = 'wow')
RETURNING id;
Run Code Online (Sandbox Code Playgroud)
这就是我所拥有的:http://sqlfiddle.com/#!15/4050a/18
我正在运行一个python脚本,将大量数据插入到Postgres数据库中,我使用单个查询来执行多行插入:
INSERT INTO table (col1,col2) VALUES ('v1','v2'),('v3','v4') ... etc
Run Code Online (Sandbox Code Playgroud)
我想知道如果它碰到插入的重复键会发生什么.它会停止整个查询并抛出异常吗?或者它只是忽略该特定行的插入并继续前进?
import psycopg2
#Given media_id and image_url and conn object
image_data = urllib2.urlopen(image_url).read()
sql =("INSERT INTO images (media_id, data)
SELECT %s
WHERE
NOT EXISTS (SELECT media_id FROM images WHERE media_is = CAST(%s as TEXT) ")
data_insert_image = (media_id, psycopg2.Binary(image_data))
cursor.execute(sql_insert_image, data_insert_image)
conn.commit()
Run Code Online (Sandbox Code Playgroud)
结果是:
TypeError: not all arguments converted during string formatting
Run Code Online (Sandbox Code Playgroud)
这对我来说很有意义,因为图像不是String; 但是,我不知道如何正确插入。应该如何进行插入?
在插入,我应该怎么唯一设置的值access_token,以一个随机字符串和值返回给客户端?
我有:
CREATE TABLE user (
id serial PRIMARY KEY,
access_token char(32) NOT NULL UNIQUE,
joined timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP
);
Run Code Online (Sandbox Code Playgroud)
数据库服务器:PostgreSQL
应用服务器:Sinatra(Ruby)
客户端:iOS
postgresql ×9
sql ×7
python ×4
upsert ×2
access-token ×1
duplicates ×1
exception ×1
mysql ×1
pandas ×1
psycopg2 ×1
sqlalchemy ×1