sqllite db上的fetchall()返回unicode字符串 [Python 2.7]

1 投票
1 回答
518 浏览
提问于 2025-04-17 22:45

我在使用fetchall()的时候遇到了一些问题。

我有一个表格是这样定义的:

with bookDB:
    bookCur = bookDB.cursor()
    bookCur.execute("CREATE TABLE Books(bookID INTEGER PRIMARY KEY, Title TEXT, Author TEXT, Genre TEXT)")
    bookCur.close()

现在如果我想根据类型在数据库中搜索书籍,我有以下这段代码:

with bookDB:
        bookCur = bookDB.cursor()
        bookCur.execute("SELECT * FROM Books WHERE Genre=?",(query,)) 
        booklist=bookCur.fetchall()
        book = ''.join(str(i) for i in booklist)
        bookCur.close()
        return book;

我想把书单中的所有项目连接成一个字符串,并把它赋值给book,但当我这样做的时候,所有的文本字段都是unicode格式(u'TEXTHERE'),而且前后的括号也保留着。我知道我可以使用多次split或者分隔符,但我觉得我一定是哪里做错了。有什么办法可以阻止这种情况发生吗?有什么建议吗?

这是我从fetchall得到的结果:

[(133, u'Jurassic Park', u'Crichton', u'Sci-Fi')]

我想要一个像这样的字符串:

133>>Jurassic Park>>Crichton>>Sci-Fi

以便通过socket发送回去。

非常感谢你的任何帮助。

1 个回答

1

booklist 是一个包含多个 tuple 的列表,这些 tuple 代表数据库中的查询列。通过执行 book = ''.join(str(i) for i in booklist),你实际上是在把 booklist 中每个 tuple 的字符串形式连接在一起。

你可以试试下面的做法:

book = '|'.join(['>>'.join(map(str, row)) for row in booklist])

这样做会返回类似这样的结果:

"133>>Jurassic Park>>Crichton>>Sci-Fi|134>>Star Wars>>Crichton>>Sci-Fi" 

其中 >> 是列的分隔符,而 | 是行的分隔符。如果你需要其他的分隔符,只需更改字符串即可。

在这段代码中,内部的 join 会把 tuple(列)连接起来,而外部的 join 则会把 连接起来。map(str, row) 是一个小技巧,用来将 tuple 转换成字符串列表,它会对 tuple 中的每个元素应用 str 方法。这样做是必要的,因为如果直接对包含非字符串元素的可迭代对象使用 join,会导致 TypeError 错误。

希望这对你有帮助!

撰写回答