我有一个使用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被锁定了?
答案 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。