检查SQLite中是否存在使用Python的行

时间:2016-05-04 13:42:57

标签: python sqlite

我想知道我的一个表中是否已存在一行,在本例中为git filter-branch --tree-filter。为了做到这一点,我在shell中使用了SQLite,并偶然发现了MainPage = new ContentPage { Content = new Grid { ColumnDefinitions = new ColumnDefinitionCollection { new ColumnDefinition { Width = new GridLength(1,GridUnitType.Auto) }, new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) } } } }; Label label; Entry entry; Grid mainGrid = ((Grid)((ContentPage)MainPage).Content); mainGrid.Children.Add(label = new Label { Text = "TEST", IsVisible = false, VerticalOptions = LayoutOptions.Center, HorizontalOptions = LayoutOptions.Start, }, 0, 0); mainGrid.Children.Add(entry = new Entry { HorizontalOptions = LayoutOptions.FillAndExpand, VerticalOptions = LayoutOptions.FillAndExpand, BackgroundColor = Color.Black, TextColor = Color.White }, 1, 0); entry.TextChanged += (sender, arg) => label.IsVisible = entry.Text.Length > 0; 。在SQLite中,这非常有效,它返回collSELECT EXISTS(SELECT 1 FROM coll WHERE ceeb="1234") - 这正是我想要的。因此,有了代码,我编写了一个快速的Python脚本,看看我是否可以在将其粘贴到我的程序之前让它为我工作。这就是我想出的:

0

不是分配1 import sqlite3 conn = sqlite3.connect('stu.db') c = conn.cursor() sceeb = int(raw_input(":> ")) ceeb_exists = c.execute('SELECT EXISTS(SELECT 1 FROM coll WHERE ceeb="%d" LIMIT 1)' % sceeb) print ceeb_exists ceeb_exists,而是为我提供一个类似于1的输出。我在这里做错了什么?

2 个答案:

答案 0 :(得分:2)

执行查询总是会产生0行或更多行。你需要获取那些行; SELECT EXISTS个查询会产生1行,因此您需要获取该行。

行总是由1列或更多列组成,在这里你得到一列,所以你可以使用元组赋值(注意,之后的ceeb_exists逗号):

c.execute('SELECT EXISTS(SELECT 1 FROM coll WHERE ceeb="%d" LIMIT 1)' % sceeb)
ceeb_exists, = c.fetchone()

但是,使用EXISTS查询在这里有点多余;您可以测试是否返回任何行。您还应该使用查询参数来避免SQL注入攻击(您要求用户提供ceeb值,这样很容易被劫持):

c.execute('SELECT 1 FROM coll WHERE ceeb=? LIMIT 1', (sceeb,))
ceeb_exists = c.fetchone() is not None
如果没有可用于提取的行,

cursor.fetchone()会返回Noneis not None测试会将其转换为TrueFalse

答案 1 :(得分:1)

正如您所见,

.executes()返回一个游标对象。 要打印查询结果,您需要迭代它:

for result in exists:
    print result