相关疑难解决方法(0)

在PostgreSQL中重复更新时插入?

几个月前,我从Stack Overflow的答案中学到了如何使用以下语法在MySQL中一次执行多个更新:

INSERT INTO table (id, field, field2) VALUES (1, A, X), (2, B, Y), (3, C, Z)
ON DUPLICATE KEY UPDATE field=VALUES(Col1), field2=VALUES(Col2);
Run Code Online (Sandbox Code Playgroud)

我现在切换到PostgreSQL,显然这是不正确的.它指的是所有正确的表,所以我认为这是使用不同关键字的问题,但我不确定PostgreSQL文档中的哪个被覆盖.

为了澄清,我想插入几个东西,如果它们已经存在则更新它们.

sql postgresql upsert sql-merge

611
推荐指数
15
解决办法
40万
查看次数

使用相同的用户名更新另一个表中的表值

我有两个表,同一列名为user_name,表示table_a,table_b.

我想,从table_b,column_b_1,column_b2,分别复制到table_b1,column_a_1,column_a_2,其中user_name是相同的,如何在sql语句中做到这一点?

sql sqlite

65
推荐指数
3
解决办法
7万
查看次数

如何使用SqlAlchemy进行upsert?

我有一个记录,我希望它存在于数据库中,如果它不存在,如果它已存在(主键存在)我希望字段更新到当前状态.这通常称为upsert.

以下不完整的代码片段演示了什么可行,但它似乎过于笨重(特别是如果有更多的列).什么是更好/最好的方式?

Base = declarative_base()
class Template(Base):
    __tablename__ = 'templates'
    id = Column(Integer, primary_key = True)
    name = Column(String(80), unique = True, index = True)
    template = Column(String(80), unique = True)
    description = Column(String(200))
    def __init__(self, Name, Template, Desc):
        self.name = Name
        self.template = Template
        self.description = Desc

def UpsertDefaultTemplate():
    sess = Session()
    desired_default = Template("default", "AABBCC", "This is the default template")
    try:
        q = sess.query(Template).filter_by(name = desiredDefault.name)
        existing_default = q.one()
    except sqlalchemy.orm.exc.NoResultFound:
        #default does not exist yet, …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy upsert

54
推荐指数
4
解决办法
3万
查看次数

在python中每n个项拆分一个生成器/ iterable(splitEvery)

我正在尝试用Python编写Haskel函数'splitEvery'.这是它的定义:

splitEvery :: Int -> [e] -> [[e]]
    @'splitEvery' n@ splits a list into length-n pieces.  The last
    piece will be shorter if @n@ does not evenly divide the length of
    the list.
Run Code Online (Sandbox Code Playgroud)

这个的基本版本工作正常,但我想要一个适用于生成器表达式,列表和迭代器的版本.并且,如果有一个发电机作为输入,它应该返回一个发电机作为输出!

测试

# should not enter infinite loop with generators or lists
splitEvery(itertools.count(), 10)
splitEvery(range(1000), 10)

# last piece must be shorter if n does not evenly divide
assert splitEvery(5, range(9)) == [[0, 1, 2, 3, 4], [5, 6, 7, 8]]

# should give same …
Run Code Online (Sandbox Code Playgroud)

python iterator split

31
推荐指数
5
解决办法
1万
查看次数

SQLAlchemy - 在postgresql中执行批量upsert(如果存在,更新,否则插入)

我正在尝试使用SQLAlchemy模块在python中编写批量upsert(而不是在SQL中!).

我在SQLAlchemy添加上收到以下错误:

sqlalchemy.exc.IntegrityError: (IntegrityError) duplicate key value violates unique constraint "posts_pkey"
DETAIL:  Key (id)=(TEST1234) already exists.
Run Code Online (Sandbox Code Playgroud)

我有一个postsid列上使用主键调用的表.

在这个例子中,我已经在db中有一行id=TEST1234.当我尝试db.session.add()使用id设置为的新帖子对象时TEST1234,我得到上面的错误.我的印象是,如果主键已经存在,记录将会更新.

如何仅使用基于主键的Flask-SQLAlchemy进行升级?有简单的解决方案吗?

如果没有,我总是可以检查并删除任何匹配id的记录,然后插入新记录,但这对我的情况来说似乎很昂贵,我不希望有很多更新.

python postgresql sqlalchemy flask-sqlalchemy

30
推荐指数
3
解决办法
2万
查看次数

如何在postgres 9.5中正确地进行upsert

用postgresql 9.5正确语法upsert,下面的查询显示column reference "gallery_id" is ambiguous错误,为什么?

var dbQuery = `INSERT INTO category_gallery (
  category_id, gallery_id, create_date, create_by_user_id
  ) VALUES ($1, $2, $3, $4)
  ON CONFLICT (category_id)
  DO UPDATE SET
  category_id = $1,
  last_modified_date = $3,
  last_modified_by_user_id = $4
  WHERE gallery_id = $2`;
Run Code Online (Sandbox Code Playgroud)

我试图改变WHERE gallery_id = $2;WHERE category_gallery.gallery_id = $2;随后显示的错误there is no unique or exclusion constraint matching the ON CONFLICT specification,但我不希望设置gallery_id或CATEGORY_ID独特监守我要确保两个列相同,那么请更新....

如何在postgres 9.5中正确进行upsert?

如果ON CONFLICT需要唯一的列,我应该使用其他方法,如何?



我想确保多列冲突然后更新,什么是正确的用法

var dbQuery = …
Run Code Online (Sandbox Code Playgroud)

sql postgresql upsert postgresql-9.5

30
推荐指数
2
解决办法
3万
查看次数

SELECT或INSERT是否容易出现竞争条件?

我写了一个函数为一个简单的博客引擎创建帖子:

CREATE FUNCTION CreatePost(VARCHAR, TEXT, VARCHAR[])
RETURNS INTEGER AS $$
    DECLARE
        InsertedPostId INTEGER;
        TagName VARCHAR;
    BEGIN
        INSERT INTO Posts (Title, Body)
        VALUES ($1, $2)
        RETURNING Id INTO InsertedPostId;

        FOREACH TagName IN ARRAY $3 LOOP
            DECLARE
                InsertedTagId INTEGER;
            BEGIN
                -- I am concerned about this part.
                BEGIN
                    INSERT INTO Tags (Name)
                    VALUES (TagName)
                    RETURNING Id INTO InsertedTagId;
                EXCEPTION WHEN UNIQUE_VIOLATION THEN
                    SELECT INTO InsertedTagId Id
                    FROM Tags
                    WHERE Name = TagName
                    FETCH FIRST ROW ONLY;
                END;

                INSERT INTO Taggings (PostId, TagId) …
Run Code Online (Sandbox Code Playgroud)

sql postgresql concurrency upsert plpgsql

25
推荐指数
2
解决办法
8449
查看次数

Python/psycopg2中的优雅主键错误处理

使用Python 2.7和

在[150]中:psycopg2.版本 [150]:'2.4.2(dt dec pq3 ext)'

我有一个简单的python脚本来处理事务并将数据写入数据库.偶尔会有一个违反我的主键的插入内容.这很好,我只是想让它忽略那条记录并继续它的快乐方式.我遇到的问题是psycopg2主键错误是在错误失败后中止整个事务块和所有插入.这是一个示例错误

ERROR: duplicate key value violates unique constraint "encounter_id_pkey"
DETAIL:  Key (encounter_id)=(9012235) already exists.
Run Code Online (Sandbox Code Playgroud)

这是在下一个插入.不违反.

Inserting: 0163168~9024065
ERROR: current transaction is aborted, commands ignored until end of transaction block
Run Code Online (Sandbox Code Playgroud)

每次插入都会重复第二个错误.这是一个简化的循环.我正在循环一个pandas数据框,但它可能是任何循环.

conn = psycopg2.connect("dbname='XXXX' user='XXXXX' host='XXXX' password='XXXXX'")

cur = conn.cursor()

for i, val in df2.iteritems():
    try:
        cur = conn.cursor()
        cur.execute("""insert into encounter_id_table (
        encounter_id,current_date  )
        values       
        (%(create_date)s, %(encounter_id)s ) ;""",
        'encounter_id':i.split('~')[1],  
        'create_date': datetime.date.today() })           
        cur.commit()
        cur.close() 
    except Exception , e:
        print 'ERROR:', e[0] …
Run Code Online (Sandbox Code Playgroud)

python sql postgresql psycopg2

18
推荐指数
1
解决办法
9888
查看次数

如何递归地找到两个表之间的相交地理位置

我正在运行Postgres 9.6.1和PostGIS 2.3.0 r15146并且有两个表.
geographies可能有150,000,000行,paths可能有10,000,000行:

CREATE TABLE paths (id uuid NOT NULL, path path NOT NULL, PRIMARY KEY (id))
CREATE TABLE geographies (id uuid NOT NULL, geography geography NOT NULL, PRIMARY KEY (id))
Run Code Online (Sandbox Code Playgroud)

给定一个数组/套ids的表geographies,什么是查找所有交叉路径与几何的"最佳"的方式?

换句话说,如果一个初始geography有一个相应的交叉,path我们还需要找到这个相交的所有其他 .从那里,我们需要找到这些新发现的所有其他相交,依此类推,直到我们找到所有可能的交叉点.geographiespathpathsgeographies

初始地理标识(我们的输入)可以是0到700之间的任何位置.平均值大约为40.
最小交叉点将为0,最大值将为大约1000.平均值可能大约为20,通常小于100连接.

我创建了一个这样做的功能,但我是PostGIS中的GIS和Postgres的新手.我发布了我的解决方案作为这个问题的答案.

我觉得应该有比我想出的更有说服力和更快速的方式.

sql gis postgresql postgis sqlgeography

17
推荐指数
1
解决办法
1631
查看次数

在sqlalchemy中的Postgresql ON CONFLICT

我读过不少资源(AO.1,2),但我无法得到PostgreSQL关于冲突忽略行为SQLAlchemy的工作.

我用这个被接受的答案作为基础,但它给出了

SAWarning: Can't validate argument 'append_string'; can't locate any SQLAlchemy dialect named 'append'
Run Code Online (Sandbox Code Playgroud)

我已经尝试将postgresql方言添加到@compile子句,重命名我的对象,但它不起作用.我也尝试使用str(insert())+ " ON CONFILCT IGNORE"没有结果.(顺便说一句,这并不奇怪)

如何才能将On CONFLICT IGNORE其添加到插入中?我喜欢建议的解决方案,因为我可以看到自己不想要IGNORE每个人的行为INSERT

PS.使用python 2.7(不介意升级到3.4/3.5),最新的sqlalchemy(1.x)

python sql postgresql sqlalchemy

15
推荐指数
4
解决办法
7777
查看次数