标签: psycopg2

如何加快PostgreSQL中的更新/替换操作?

我们有一个相当特殊的应用程序,它使用PostgreSQL 8.3作为存储后端(使用Python和psycopg2).我们对重要表执行的操作在大多数情况下都是插入或更新(很少删除或选择).

出于理智的原因,我们已经创建了我们自己的数据映射器层,它运行得相当好,但它有一个很大的瓶颈,即更新性能.当然,我不希望更新/替换场景像'插入空表'那样快速,但是接近它会很好.

请注意,此系统没有并发更新

我们总是在更新中设置每行的所有字段,这可以在我在测试中使用"替换"一词的术语中看到.到目前为止,我已经尝试了两种解决更新问题的方法:

  1. 创建一个replace()需要更新行数组的过程:

    CREATE OR REPLACE FUNCTION replace_item(data item[]) RETURNS VOID AS $$
    BEGIN
        FOR i IN COALESCE(array_lower(data,1),0) .. COALESCE(array_upper(data,1),-1) LOOP
           UPDATE item SET a0=data[i].a0,a1=data[i].a1,a2=data[i].a2 WHERE key=data[i].key;
        END LOOP;
    END;
    $$ LANGUAGE plpgsql
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建一个insert_or_replace规则,以便除偶尔删除之外的所有内容都成为多行插入

    CREATE RULE "insert_or_replace" AS
        ON INSERT TO "item"
        WHERE EXISTS(SELECT 1 FROM item WHERE key=NEW.key)
        DO INSTEAD
            (UPDATE item SET a0=NEW.a0,a1=NEW.a1,a2=NEW.a2 WHERE key=NEW.key);
    
    Run Code Online (Sandbox Code Playgroud)

这两者都加快了更新速度,虽然后者减慢了插入量:

Multi-row insert           : 50000 items inserted in  1.32 seconds averaging 37807.84 items/s
executemany() …
Run Code Online (Sandbox Code Playgroud)

python sql postgresql psycopg2

19
推荐指数
1
解决办法
5087
查看次数

SQLAlchemy,Psycopg2和Postgresql COPY

看起来Psycopg有一个用于执行COPY的自定义命令:

psycopg2 COPY使用cursor.copy_from()冻结大输入

有没有办法从SQLAlchemy访问此功能?

postgresql sqlalchemy psycopg2

19
推荐指数
6
解决办法
1万
查看次数

使用python作为字典从postgresql查询

我正在使用Python 2.7和postgresql 9.1.试图从查询中获取字典,我已经尝试了这里描述的代码:http: //wiki.postgresql.org/wiki/Using_psycopg2_with_PostgreSQL

import psycopg2
import psycopg2.extras
conn = psycopg2.connect("dbname=mydb host=localhost user=user password=password")
cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
cur.execute ("select * from port")
type(cur.fetchall())
Run Code Online (Sandbox Code Playgroud)

它打印下一个答案:

<type 'list'>
Run Code Online (Sandbox Code Playgroud)

打印项目本身,告诉我它是列表.除外答案是字典.

编辑:

尝试下一个:

ans = cur.fetchall()[0]
print ans
print type(ans)
Run Code Online (Sandbox Code Playgroud)

回报

[288, 'T', 51, 1, 1, '192.168.39.188']
<type 'list'>
Run Code Online (Sandbox Code Playgroud)

python postgresql dictionary psycopg2 python-2.7

19
推荐指数
6
解决办法
3万
查看次数

在pypy上安装pip

我想加快我的程序,所以我想设置pypy + psycopg2cffi.该程序打开一个xml,解析它然后在数据库中插入一些数据.我正在使用python3,postgresql和psycopg2,但这种方法非常慢.所以我想尝试用pypy + psycopg2cffi运行我的程序.我有python 3和pypy,我想安装psycopg2cffi所以我运行这个命令:

pip install psycopg2cffi psycopg2cffi-compat 
Run Code Online (Sandbox Code Playgroud)

但psycopg2cffi只安装在python上,因为当我尝试在pypy上导入psycopg2cffi这是我得到的错误:

ImportError: No module named psycopg2cffi
Run Code Online (Sandbox Code Playgroud)

所以我想我需要先安装pip,但我可以弄清楚如何做到这一点.

我怎么能在pypy上安装它?谢谢.

python pypy pip psycopg2

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

用Python直接重新创建Postgres COPY?

我有一个数据块,目前作为n元组的列表,但格式非常灵活,我想附加到Postgres表 - 在这种情况下,每个n元组对应于DB中的一行.

到目前为止我一直在做的是将这些全部写入CSV文件,然后使用postgres的COPY将所有这些内容加载到数据库中.这是有效的,但是不是最理想的,我更愿意直接从python中完成这一切.在python中是否有一种方法可以在Postgres中复制COPY类型的批量加载?

python postgresql psycopg2

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

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
查看次数

大查询后psycopg2泄漏内存

我正在使用psycopg2(我升级到2.5版)在我的postgres数据库的python脚本中运行一个大型查询.查询完成后,我关闭光标和连接,甚至运行gc,但进程仍然消耗大量内存(确切地说是7.3gb).我错过了一个清理步骤吗?

import psycopg2
conn = psycopg2.connect("dbname='dbname' user='user' host='host'")
cursor = conn.cursor()
cursor.execute("""large query""")
rows = cursor.fetchall()
del rows
cursor.close()
conn.close()
import gc
gc.collect()
Run Code Online (Sandbox Code Playgroud)

python postgresql psycopg2

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

如何在没有遇到libssl错误的情况下在El Capitan上运行psycopg2

我的Mac上有一个python django dev设置,刚升级到El Capitan.

我在virtualenv中安装了psycopg2但是当我运行我的服务器时出现以下错误 -

django.core.exceptions.ImproperlyConfigured: Error loading psycopg2 module: dlopen(/Users/aidan/Environments/supernova/lib/python2.7/site-packages/psycopg2/_psycopg.so, 2): Library not loaded: libssl.1.0.0.dylib
  Referenced from: /Users/aidan/Environments/supernova/lib/python2.7/site-packages/psycopg2/_psycopg.so
  Reason: image not found
Run Code Online (Sandbox Code Playgroud)

我已经尝试重新安装我的virtualenv

pip install -f requirements.txt
Run Code Online (Sandbox Code Playgroud)

我尝试升级psycopg2

pip uninstall psycopg2
pip install psycopg2
Run Code Online (Sandbox Code Playgroud)

但我仍然得到同样的错误.

我也尝试过添加符号链接,/usr/lib但El Capitan的新无根的东西不允许 -

$ sudo ln -s /Library/PostgreSQL/9.2/lib/libssl.1.0.0.dylib
 /usr/lib
ln: /usr/lib/libssl.1.0.0.dylib: Operation not permitted
Run Code Online (Sandbox Code Playgroud)

所以我试着/usr/local无济于事.

openssl的系统版本似乎是1.0.2 -

$ openssl version
OpenSSL 1.0.2d 9 Jul 2015
Run Code Online (Sandbox Code Playgroud)

我该如何解决?

python psycopg2 libssl osx-elcapitan

18
推荐指数
3
解决办法
9680
查看次数

Psycopg2插入带占位符的表中

这可能是一个相当愚蠢的问题,但我在这里做错了什么?它创建表但INSERT INTO不起作用,我想我的占位符有问题吗?

conn = psycopg2.connect("dbname=postgres user=postgres")
cur = conn.cursor()
escaped_name = "TOUR_2"
cur.execute('CREATE TABLE %s(id serial PRIMARY KEY, day date, elapsed_time varchar,    net_time varchar, length float, average_speed float, geometry GEOMETRY);' % escaped_name)

cur.execute('INSERT INTO %s (day,elapsed_time, net_time, length, average_speed, geometry) VALUES (%s, %s, %s, %s, %s, %s)', (escaped_name, day ,time_length,  time_length_net, length_km, avg_speed,  myLine_ppy))

conn.commit()
cur.close()
conn.close()
Run Code Online (Sandbox Code Playgroud)

INSERT INTO调用不起作用,它给了我

cur.execute('INSERT INTO %s (day,elapsed_time, net_time, length, average_speed,  
geometry) VALUES (%s, %s, %s, %s, %s, %s)'% (escaped_name, day ,time_length,  
time_length_net, length_km, avg_speed, …
Run Code Online (Sandbox Code Playgroud)

python postgresql postgis psycopg2 psycopg

17
推荐指数
2
解决办法
4万
查看次数

在psycopg2中设置transaction\query timeout?

有没有办法在psycopg2中为db事务或db查询设置超时?

示例用例:
Heroku将django Web请求限制为30秒,之后Heroku终止请求,而不允许django优雅地回滚任何尚未返回的事务.这可以在postgres上打开未完成的交易.您可以在数据库中配置超时,但这也会限制非与Web相关的查询,例如维护脚本分析等.在这种情况下,通过中间件(或通过django)设置超时将是更可取的.

timeout transactions psycopg2 heroku

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