我有一段Python代码,它通过psycopg与PostgreSQL数据库交互.
所有文献都警告不要自己进行sql格式化,并建议让驱动程序这样做.例如:
cur.execute('select name, age from people where name = %s;', ('ann',) )
Run Code Online (Sandbox Code Playgroud)
然后驱动程序格式化sql字符串.假设我不想执行任何操作,但我只想要完全格式化的sql字符串.是否有任何功能可以在psycopg模块中获取此格式化的sql?
这可能是一个相当愚蠢的问题,但我在这里做错了什么?它创建表但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) psycopg文档声明:"Psycopg连接不是绿色线程安全的,并且不能由不同的绿色线程同时使用.尝试每个线程使用一个游标执行多个命令将导致错误(或版本上的死锁因此,建议程序员避免在协同程序之间共享连接或使用库友好的锁来同步共享连接,例如用于池化.
我找不到绿色线程安全的池的实现 - 那里有没有?
这个字符串:
"CREATE USER %s PASSWORD %s", (user, pw)
Run Code Online (Sandbox Code Playgroud)
总是扩大到:
CREATE USER E'someuser' PASSWORD E'somepassword'
Run Code Online (Sandbox Code Playgroud)
谁能告诉我为什么?
编辑:上面的扩展字符串是我的数据库在错误消息中返回的字符串.我正在使用psycopg2来访问我的postgres数据库.真正的代码如下所示:
conn=psycopg2.connect(user=adminuser, password=adminpass, host=host)
cur = conn.cursor()
#user and pw are simple standard python strings the function gets as parameter
cur.execute("CREATE USER %s PASSWORD %s", (user, pw))
conn.commit()
Run Code Online (Sandbox Code Playgroud) 我有一个应用程序,它将csv文件中的数据解析并加载到Postgres 9.3数据库中.在串行执行中,插入语句/游标执行没有问题.
我在混合中添加了celery以添加并行解析和插入数据文件.解析工作正常.但是,我去运行插入语句,我得到:
[2015-05-13 11:30:16,464: ERROR/Worker-1] ingest_task.work_it: Exception
Traceback (most recent call last):
File "ingest_tasks.py", line 86, in work_it
rowcount = ingest_data.load_data(con=con, statements=statements)
File "ingest_data.py", line 134, in load_data
ingest_curs.execute(statement)
DatabaseError: error with no message from the libpq
Run Code Online (Sandbox Code Playgroud) 我查看了文档,但是没有找到任何让我知道我通过cursor.execute("...")执行的最后一个命令是否成功的信息.
我期待一个像"1行受影响"的回复.
我使用psycopg2连接到Python上的PostgreSQL,我想使用连接池.
当我执行INSERT查询时,我不知道该怎么做而不是commit()和rollback().
db = pool.SimpleConnectionPool(1, 10,host=conf_hostname,database=conf_dbname,user=conf_dbuser,password=conf_dbpass,port=conf_dbport)
# Get Cursor
@contextmanager
def get_cursor():
con = db.getconn()
try:
yield con.cursor()
finally:
db.putconn(con)
with get_cursor() as cursor:
cursor.execute("INSERT INTO table (fields) VALUES (values) RETURNING id")
id = cursor.fetchone()
Run Code Online (Sandbox Code Playgroud)
没有commit()我没有得到插入记录的id.
我目前正在分析维基百科转储文件; 我正在使用python从中提取一堆数据并将其持久化到PostgreSQL数据库中.我总是试图让这个文件变得更快(18GB).为了与PostgreSQL接口,我使用的是psycopg2,但是这个模块似乎模仿了许多其他类似的DBAPI.
无论如何,我有一个关于cursor.executemany(命令,值)的问题; 在我看来,每1000个值左右执行一次executemany比为这500万个值中的每一个调用cursor.execute(命令%值)更好(请确认或纠正我!).
但是,你看,我正在使用executemany将1000行插入到具有UNIQUE完整性约束的表中; 这个约束事先没有在python中验证过,因为这要么一直要求SELECT(这似乎适得其反)或要求我获得超过3 GB的RAM.所有这一切都说,当我的脚本试图通过捕获psycopg2.DatabaseError来插入已存在的行时,我指望Postgres警告我.
当我的脚本检测到这样的非UNIQUE INSERT时,它的connection.rollback()(每次都会产生1000行,并且使得executemany变得毫无价值),然后逐个INSERT所有值.
由于psycopg2的记录很少(因为有很多很棒的模块......),我找不到一个有效且有效的解决方法.我已经将每个executemany INSERTed的值从1000减少到100,以减少每个executemany非UNIQUE INSERT的可能性,但我很确定他们只是告诉psycopg2忽略这些exece或告诉游标继续executemany.
基本上,这似乎是一种解决方案如此容易和流行的问题,我所能做的就是要求了解它.
再次感谢!
cur.mogrify
mysql 上的 psycopg 相当于什么?
来自:http : //initd.org/psycopg/docs/cursor.html
mogrify(operation[, parameters]) 在参数绑定后返回一个查询字符串。返回的字符串正是将被发送到运行 execute() 方法或类似方法的数据库的字符串。
>cur.mogrify("INSERT INTO test (num, data) VALUES (%s, %s)", (42, 'bar'))
>"INSERT INTO test (num, data) VALUES (42, E'bar' )”DB API 扩展 mogrify() 方法是 DB API 2.0 的 Psycopg 扩展。
提前致谢。
我正在访问带有序列化事务隔离的 postgresql 表。我正在做这样的事情(使用现有的 psycopg2 连接conn
和该连接中的光标,cur
:
while True:
try:
cur.execute(query)
break
except TransactionRollbackError:
[sleep a little]
continue
except Exception:
[handle error here]
Run Code Online (Sandbox Code Playgroud)
这样做的目的是在序列化争用的情况下重试。现在,这在大部分时间都可以正常工作。但我经常在TransactionRollbackError
陷阱中进行一次迭代后收到此错误:
current transaction is aborted, commands ignored until end of transaction block
. 显然,以这种方式旋转以避免序列化争用是不合适的?我应该以不同的方式做这件事吗?
一些注意事项:我正在使用不同的进程访问表(它们都是相同的并且做同样的事情:选择、增加和更新/插入到表中。)这些进程中的每一个都有自己的连接conn
,它们不共享一个联系。
另一个注意事项:似乎在通过TransactionRollbackError
异常块一次之后,在 while 循环的下一次旋转中,它最终在Exception
异常块中结束。
还有一个注意事项:同时运行的进程数对错误的频率有直接影响,因为更多的进程往往会产生更多的错误。因此,存在某种争论。我的印象是使用带重试的序列化事务隔离(如在我的演示代码中)可以解决这个问题。
psycopg ×10
python ×10
postgresql ×7
psycopg2 ×2
asynchronous ×1
celery ×1
database ×1
gevent ×1
mysql ×1
postgis ×1