Python SQLite3 - 表输出格式问题&处理IntegrityError

时间:2011-07-21 05:47:39

标签: python sql database sqlite

我有一个使用Python + Sqlite3

创建的表
c.execute('CREATE TABLE IF NOT EXISTS reg(col1 TEXT PRIMARY KEY, col2 TEXT)')

我甚至用val1和val2变量写了一个记录,这些变量有字符串值(特定的URL)

c.execute('INSERT INTO reg VALUES(?,?)', (val1, val2))

现在我使用此代码打印表格

c.execute('SELECT * FROM reg')
rows = c.fetchall()
print rows

将输出显示为

[(u'http://www.someURL.com', u'http://www.someURL.com/someDIR/')]

现在,我的列值前面的 u 是什么意思?

编辑:我的下一个疑问是继续这个问题所以我正在更新这个帖子,而不是创建一个新的。我也更新了标题。希望没关系。

从上面的代码可以看出,我的col1显然是主键。因此,当我第二次尝试有目的地插入相同的记录时,它会抛出异常

IntegrityError: column col1 is not unique

为了解决这个问题,我修改了这样的代码......

try:
    c.execute('INSERT INTO reg VALUES(?,?)', (val1, val2))
except sqlite3.IntegrityError:
    print val1+ " is already in the database"

现在执行此代码导致我出现此异常

Traceback (most recent call last):
  File "C:\Documents and Settings\user\Desktop\dbUrl.py", line 47, in <module>
    c.execute('INSERT INTO reg VALUES(?,?)', (val1,val2))
OperationalError: database is locked

我知道如何解决这个问题?事实上,我甚至不明白这个OperationError是什么意思以及是什么导致DB被锁定了?

2 个答案:

答案 0 :(得分:2)

u表示这些是Unicode字符串。它们可以编码为您想要的任何字符集:

u'http://www.someURL.com'.encode('ascii') # or 'latin-1' or 'utf-8'

你将获得不带u的相同字符串,因为它们都是ASCII字符。

请参阅http://docs.python.org/howto/unicode.html

如果字符串只包含ASCII字符(英文键盘上的所有普通符号),那么您不必过于担心这一点。但是,如果您使用的是扩展字符集,则需要确保在保存字符串或将其显示给用户时指定正确的编码。

编辑:执行时

import sqlite3

con = sqlite3.connect(":memory:")
con.isolation_level = None
c = con.cursor()

val1, val2 = 'a', 'b'

c.execute('CREATE TABLE IF NOT EXISTS reg(col1 TEXT PRIMARY KEY, col2 TEXT)')
c.execute('INSERT INTO reg VALUES(?,?)', (val1, val2))
try:
    c.execute('INSERT INTO reg VALUES(?,?)', (val1, val2))
except sqlite3.IntegrityError:
    print val1, "is already in the database"

我得到a is already in the database。 (注意执行该print语句的正确方法,尽管你的完全有效。)所以你的问题就在其他地方 - locked意味着其他东西正在写入数据库。像我一样在内存数据库中尝试这个,所以你肯定知道没有其他东西可以访问它。如果这样可行,那么您的问题就是异常所指示的 - 其他东西正在访问数据库。

答案 1 :(得分:1)

这意味着字符串被编码为Unicode