我想知道是否有人可以给我一个Android游标的简要概述.几个具体问题:
1 - 我有一个在数据库查询后返回游标的方法:
public static Cursor getVehicles()
{
SQLiteDatabase db = vehicleData.getReadableDatabase();
Cursor cursor = db.query(TABLE_NAME, GET_VEHICLES_FROM_CLAUSE, null, null, null, null, ORDER_BY);
return cursor;
}
Run Code Online (Sandbox Code Playgroud)
为了做家务,我在return语句之前尝试了db.close().但是,这会导致返回的游标不包含任何行.为什么是这样?
2 - 关闭游标和关闭数据库有什么区别?
3 - 如果它是一个局部变量,我是否需要在Cursor上调用close,还是可以将它留给垃圾收集器进行清理?
4 - 我的数据库很小,仅供我的应用程序使用 - 我可以保持打开状态吗?
我目前的Python脚本有一个问题,当我从cursor.execute()执行特定函数的SQL函数时,它运行该函数,函数完成,然后脚本挂起接近五个小时,然后才恢复其余部分的程序。
我在 pgAdminIII 中观察函数的服务器状态,因为它是从 Python 调用的,当函数完成时,服务器仅显示与我的 python 用户的打开连接。在事务空闲之前,但添加 conn.set_isolation_level(0) 后,它只显示打开的连接。
我还在cursor.execute() 周围放置了打印内容,但需要五个小时才能继续执行以下打印语句。我尝试过终止连接并重新启动,但无济于事。我将函数调用完全从脚本中删除,因此这是我的脚本处理的唯一进程。没有任何效果。
困难在于,双方都不断指责对方是问题的根源。我假设这是该特定功能的某种交互作用。也许在运行特定函数后信号没有从 postgres 发送回 python?其他函数都没有使用相同的执行方法的问题。
有想法吗?解决方案?-我正在考虑超时,但运行时间可能从 20 分钟到 2 小时不等。-它运行的函数创建一个表并仅返回一个表示“完成”的字符串,在它作为服务器状态中的活动函数消失后,所有操作都会在数据库中进行说明。
这是我用于复制问题的代码,与我的主脚本隔离:
#!/usr/bin/env python
import sys
import os
import smtplib
import ftplib
import gzip
import logging
import shutil
import argparse
import traceback
import subprocess
from email.mime.text import MIMEText
import psycopg2
import psycopg2.extras
import psycopg2.extensions
from psycopg2 import OperationalError
pg_db = "ppl"
pg_port = "5432"
pg_user = "<user>"
pg_pass = "<pass>"
pg_host = "<host>"
# connect to database
try:
conn = …Run Code Online (Sandbox Code Playgroud) 我正在使用 python-mysql(MySQLdb) 来查询 Mysql 服务器。游标模块有两种:一种是客户端游标,如:
cursor = db.cursor(MySQLdb.cursors.DictCursor)
Run Code Online (Sandbox Code Playgroud)
另一种是服务器端游标,如:
cursor = db.cursor(MySQLdb.cursors.SSDictCursor)
Run Code Online (Sandbox Code Playgroud)
文档说服务器端游标意味着Mysql会在mysql服务器端缓存一些结果,然后将它们发送到客户端。我对此很困惑,比方说,如果我想杀死一台 mysql 服务器,我可以使用多个服务器端游标,然后 mysql 就会因为内存耗尽而死掉。此外,服务器大小光标有任何意义吗?默认情况下,Mysql 机制是当 mysql 检索到一条记录时,它会立即将其发送给客户端。缓存结果然后将其发送出去是否有意义?
我真的不知道应该使用哪个游标,客户端游标还是服务器端游标?
我不明白在版本9中使用光标!你需要光标吗?
在下面的示例中,在控制台行中调用函数后得到:
<openerp.sql_db.Cursor object at 0x7f94f4c0b0d0>
@api.multi
def my_func(self):
cursor = self.env.cr
print(cursor)
Run Code Online (Sandbox Code Playgroud)
任何简单的例子何时以及为何使用游标?
对于大型数据集,offset基于分页会变得很慢,因此更快的方法是使用基于游标的分页。基本上,这是一个锚点,数据库知道从该点开始查找结果。考虑到这一点,这就是我面临的问题:
我有一个tv_watchers带有自动增量id、mins_watching_tv和user_id(下面总共 20 行)的表。在这个例子中user_id也是一样的1,所以不用担心。我们希望按照看电视的分钟数从最高到最低进行排序。
使用以下查询可以轻松完成此操作:
SELECT * FROM tv_watchers
ORDER BY mins_watching_tv DESC, id ASC
Run Code Online (Sandbox Code Playgroud)
这将返回 20 个字段的正确顺序,按照我们想要的方式按 id 排序:
2, 17, 1, 16, 15, 5, 6, 7, 8, 9, 10, 11, 12, 13, 20, 3, 4, 14, 19, 18
Run Code Online (Sandbox Code Playgroud)
问题是我们想要将其分成 5 个块(我们称之为批次),因为我们想要按上述顺序返回 5 个结果。我们通过检索前 6 个结果,将前 5 个结果返回给用户,并使用第 6 个结果(如果它存在)作为光标(锚点)来获取下一批结果:这将正确返回第一批结果:
-- (Batch 1) 2, 17, 1, 16, 15, 5
SELECT * FROM tv_watchers
ORDER BY …Run Code Online (Sandbox Code Playgroud) 我使用WITH HOLD允许游标用于后续事务的选项创建了一个游标。
我想检索游标可以获取的行数。由于保留游标表示的行被复制到临时文件或内存区域中,我想知道是否可以以直接的方式检索该数字,或者唯一的解决方案是获取所有记录来对它们进行计数。
在这种情况下,MOVE FORWARD ALL FROM <cursor>语句返回MOVE x。其中 x 是移动的数字。结果是写入标准输出的命令标记,我不知道如何在 pgsql 函数中检索该值。GET DIAGNOSTICS <var> := ROW_COUNT只适用于FETCH但不适用MOVE。
这是一个解决方案建议,您认为我可以如何改进它?(是否可以使用MOVE而不是FETCH检索 x 值?)
-- Function returning the number of rows available in the cursor
CREATE FUNCTION get_cursor_size(_cursor_name TEXT)
RETURNS TEXT AS
$func$
DECLARE
_n_rows int;
BEGIN
-- Set cursor at the end of records
EXECUTE format('FETCH FORWARD ALL FROM %I', _cursor_name);
-- Retrieve number of rows
GET …Run Code Online (Sandbox Code Playgroud) 有没有办法用动态SQL语句执行Cursor For循环?
如果我不想声明一个记录,我可以做这样的事情(只有当我声明了光标..):
For I in cuSelect Loop
dbms_output.put_line(I.NAME);
End Loop;
Run Code Online (Sandbox Code Playgroud)
我可以打开一个动态SQL语句的游标:
Open cuSelect For 'Select * From TAB_X';
Fetch ceSelect Into recSelect;
Close cuSelect;
Run Code Online (Sandbox Code Playgroud)
但要做到这一点,我必须首先声明记录.
现在我的问题是我必须为一个非常大而复杂的动态SQL语句打开Cursor.记录的结构是未知的.有没有办法打开一个变量游标并用"未声明"记录迭代它?
我正在使用 connection.cursor 打开一个游标,执行一系列删除操作,然后关闭游标。它有效,但我不确定它是否有任何副作用。如有任何反馈,我们将不胜感激。
from django.db import connection
c=connection.cursor()
try:
c.execute('delete from table_a')
c.execute('delete from table_b')
...
finally:
c.close()
Run Code Online (Sandbox Code Playgroud) python django database-connection django-database database-cursor
在 psycopg2 中使用单个游标来执行针对使用多个游标的所有查询有什么区别。
即,说我这样做:
import psycopg2 as pg2
con = psycopg2.connect(...)
cur = con.cursor()
cur.execute(...)
....
....
cur.execute(...)
...
Run Code Online (Sandbox Code Playgroud)
之后每次我希望执行查询时,我都使用相同的 cursor cur。
或者,每次我想查询我的数据库时,我都可以这样做:
with cur as con.cursor():
cur.execute(...)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,cur每次使用后我的光标都会被删除。
哪种方法更好?一个人比另一个人有优势吗?一个比另一个快吗?更一般地说,为什么甚至需要一个连接的多个游标?
我正在对光标的每个元素执行一个进程,我的集合有大约 600 万个文档,整个过程最多需要 10 个小时,因为我必须一次处理一个配置文件,而且对于每一个。
\n\n var cursor = dbMain.collection("profiles").find({});\n\n var getNext = function(){\n cursor.nextObject(processOne);\n };\n\n var processOne = function(err, profile){\n if(err){\n console.error("Error loading profile", err);\n getNext();\n } else if(profile == null){\n // process is done, all profiles processed!!!\n } else {\n processProfile(profile)\n .then(function(){\n getNext();\n })\n .catch(function(errProfile){\n console.error("Error processing profile", errProfile);\n getNext();\n });\n }\n };\n\n var processProfile = function(profile){\n // Complex profile processing and promise resolve when done\n };\n\n getNext();\nRun Code Online (Sandbox Code Playgroud)\n\n问题:当我有大约 300,000 个配置文件时,我得到 null(这意味着光标已耗尽),因此,只有前 300,000 个左右得到处理。\xc2\xbf有人知道如何处理它或者我提前得到 null 的原因吗?
\n