我想知道我的一个表中是否已存在一行,在本例中为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中,这非常有效,它返回coll
或SELECT 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
的输出。我在这里做错了什么?
答案 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()
会返回None
,is not None
测试会将其转换为True
或False
。
答案 1 :(得分:1)
.executes()
返回一个游标对象。
要打印查询结果,您需要迭代它:
for result in exists:
print result