我试图在python中获取从sqlite3数据库返回的行数,但似乎该功能不可用:
在php
mysqli_num_rows()
mysql
虽然我设计了一种方法,但它很尴尬:假设一个类执行sql
并给我结果:
# Query Execution returning a result
data = sql.sqlExec("select * from user")
# run another query for number of row checking, not very good workaround
dataCopy = sql.sqlExec("select * from user")
# Try to cast dataCopy to list and get the length, I did this because i notice as soon
# as I perform any action of the data, data becomes null
# This is not too good as someone else can perform another transaction on the database
# In the nick of time
if len(list(dataCopy)) :
for m in data :
print("Name = {}, Password = {}".format(m["username"], m["password"]));
else :
print("Query return nothing")
是否有能够在没有压力的情况下做到这一点的功能或属性。
答案 0 :(得分:5)
通常,cursor.rowcount
会为您提供查询结果的数量。
但是,对于SQLite,由于SQLite生成结果的性质,该属性通常设置为-1。如果没有COUNT()
查询首先,您通常不会知道返回的结果数。
这是因为SQLite在数据库中找到行时会产生行,并且本身不知道在到达数据库末尾之前会产生多少行。
来自cursor.rowcount
的文档:
虽然
Cursor
模块的sqlite3
类实现了这个属性,但数据库引擎自己支持确定“受影响的行”/“选择的行”是古怪的。对于
executemany()
语句,修改次数总计为rowcount
。根据Python DB API Spec的要求,如果对游标没有执行
rowcount
,则executeXX()
属性“为-1,或者接口无法确定最后一个操作的rowcount ”。 这包括SELECT
语句,因为在获取所有行之前,我们无法确定查询生成的行数。
强调我的。
对于您的特定查询,您可以添加一个子选择来添加列:
data = sql.sqlExec("select (select count() from user) as count, * from user")
然而,这对于大型表来说效率并不高。
如果您只需一行,请改为使用cursor.fetchone()
:
cursor.execute('SELECT * FROM user WHERE userid=?', (userid,))
row = cursor.fetchone()
if row is None:
raise ValueError('No such user found')
result = "Name = {}, Password = {}".format(row["username"], row["password"])
答案 1 :(得分:5)
使用以下内容:
dataCopy = sql.sqlExec("select count(*) from user")
values = dataCopy.fetchone()
print values[0]
答案 2 :(得分:5)
我发现在非常大的数据库上,带有count()的select语句运行缓慢。此外,使用fetch all()
可能会占用大量内存。
除非您明确设计数据库以使其不具有rowid,否则您始终可以尝试快速解决方案
cur.execute("SELECT max(rowid) from Table")
n = cur.fetchone()[0]
这将告诉您数据库有多少行。
答案 3 :(得分:1)
import sqlite3
conn = sqlite3.connect(path/to/db)
cursor = conn.cursor()
cursor.execute("select * from user")
results = cursor.fetchall()
print len(results)
len(结果)就是你想要的
答案 4 :(得分:1)
这里一个简单的替代方法是使用fetchall将列拉入python列表,然后计算列表的长度。我不知道这是pythonic还是特别有效,但似乎有效:
class ScrollImageViewController: UIViewController, UIScrollViewDelegate {
@IBOutlet weak var pageControl: UIPageControl!
@IBOutlet weak var scrollImage: UIScrollView!
@IBOutlet weak var numberOfPagesLabel: UILabel!
private var imageView: UIImageView!
var imagesArray = [String]()
override func viewDidLoad() {
super.viewDidLoad()
self.pageControl.numberOfPages = imagesArray.count
self.numberOfPagesLabel.layer.cornerRadius = 15.0
self.numberOfPagesLabel.clipsToBounds = true
self.numberOfPagesLabel.text = "\(self.pageControl.currentPage)/\(self.imagesArray.count)"
for i in 0..<imagesArray.count {
imageView = UIImageView()
imageView.sd_setImage(with: URL(string: imagesArray[i]))
imageView.contentMode = .scaleAspectFit
let xPosition = self.view.frame.width * CGFloat(i)
imageView.frame = CGRect(x: xPosition, y: 0, width: self.scrollImage.frame.width, height: self.scrollImage.frame.height)
scrollImage.contentSize.width = scrollImage.frame.width * CGFloat(i + 1)
scrollImage.addSubview(imageView)
}
}
func scrollViewDidScroll(_ scrollView: UIScrollView) {
let currentPage = scrollImage.contentOffset.x / UIScreen.main.bounds.size.width
if pageControl.currentPage < imagesArray.count {
self.pageControl.currentPage += 1
self.numberOfPagesLabel.text = "\(self.pageControl.currentPage + 1)/\(self.imagesArray.count)"
} else if pageControl.currentPage != 0 {
self.pageControl.currentPage -= 1
self.numberOfPagesLabel.text = "\(self.pageControl.currentPage - 1)/\(self.imagesArray.count)"
}
pageControl.currentPage = Int(currentPage)
}
}
答案 5 :(得分:0)
这段代码对我有用:
import sqlite3
con = sqlite3.connect(your_db_file)
cursor = con.cursor()
result = cursor.execute("select count(*) from your_table") #returns array of tupples
num_of_rows = result[0][0]
答案 6 :(得分:0)
当您只需要预先估算时,只需使用COUNT():
n_estimate = cursor.execute("SELECT COUNT() FROM user").fetchone()[0]
要在获取数据之前获取确切的数字,请使用锁定的“ Read transaction”,在此期间不会从外部更改表,例如:
cursor.execute("BEGIN") # start transaction
n = cursor.execute("SELECT COUNT() FROM user").fetchone()[0]
# if n > big: be_prepared()
allrows=cursor.execute("SELECT * FROM user").fetchall()
cursor.connection.commit() # end transaction
assert n == len(allrows)
注意:普通的SELECT
也会锁定-但直到它本身被完全提取或光标关闭或commit()
/ END
或其他操作隐式结束事务为止... < / p>
答案 7 :(得分:0)
以下脚本有效:
def say():
global s #make s global decleration
vt = sqlite3.connect('kur_kel.db') #connecting db.file
bilgi = vt.cursor()
bilgi.execute(' select count (*) from kuke ') #execute sql command
say_01=bilgi.fetchone() #catch one query from executed sql
print (say_01[0]) #catch a tuple first item
s=say_01[0] # assign variable to sql query result
bilgi.close() #close query
vt.close() #close db file
答案 8 :(得分:0)
我喜欢
cursor.execute("select count(*) from my_table")
results = cursor.fetchone()
print(results[0])