我们有一个相当特殊的应用程序,它使用PostgreSQL 8.3作为存储后端(使用Python和psycopg2).我们对重要表执行的操作在大多数情况下都是插入或更新(很少删除或选择).
出于理智的原因,我们已经创建了我们自己的数据映射器层,它运行得相当好,但它有一个很大的瓶颈,即更新性能.当然,我不希望更新/替换场景像'插入空表'那样快速,但是接近它会很好.
请注意,此系统没有并发更新
我们总是在更新中设置每行的所有字段,这可以在我在测试中使用"替换"一词的术语中看到.到目前为止,我已经尝试了两种解决更新问题的方法:
创建一个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)创建一个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 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) 我想加快我的程序,所以我想设置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上安装它?谢谢.
我有一个数据块,目前作为n元组的列表,但格式非常灵活,我想附加到Postgres表 - 在这种情况下,每个n元组对应于DB中的一行.
到目前为止我一直在做的是将这些全部写入CSV文件,然后使用postgres的COPY将所有这些内容加载到数据库中.这是有效的,但是不是最理想的,我更愿意直接从python中完成这一切.在python中是否有一种方法可以在Postgres中复制COPY类型的批量加载?
使用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) 我正在使用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) 我的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)
我该如何解决?
这可能是一个相当愚蠢的问题,但我在这里做错了什么?它创建表但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) psycopg2 ×10
python ×8
postgresql ×7
sql ×2
dictionary ×1
heroku ×1
libssl ×1
pip ×1
postgis ×1
psycopg ×1
pypy ×1
python-2.7 ×1
sqlalchemy ×1
timeout ×1
transactions ×1