PythonSQLite3-表格输出格式问题&;处理完整性错误

PythonSQLite3-表格输出格式问题&;处理完整性错误,python,sql,database,sqlite,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('SELECT * FROM reg') rows = c.fetchall() print rows 它将输出显示为 [(u'http://www.som

我使用Python+Sqlite3创建了一个表

c.execute('CREATE TABLE IF NOT EXISTS reg(col1 TEXT PRIMARY KEY, col2 TEXT)')
我甚至使用带有字符串值的val1和val2变量(URL是特定的)在其中写入了一条记录

现在,当我使用此代码打印表时

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
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
为了处理这个问题,我修改了如下代码

try:
    c.execute('INSERT INTO reg VALUES(?,?)', (val1, val2))
except sqlite3.IntegrityError:
    print val1+ " is already in the database"
现在执行这段代码导致了这个异常

IntegrityError: column col1 is not unique
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
回溯(最近一次呼叫最后一次):
文件“C:\Documents and Settings\user\Desktop\dbUrl.py”,第47行,在
c、 执行('INSERT INTO reg VALUES(?,),(val1,val2))
操作错误:数据库已锁定

你知道我该怎么解决这个问题吗?事实上,我甚至不明白这个操作错误是什么意思,以及是什么导致数据库被锁定?

这意味着字符串被编码为

u表示这些是Unicode字符串。可以将它们编码为所需的任何字符集:

u'http://www.someURL.com'.encode('ascii') # or 'latin-1' or 'utf-8'
您将返回没有
u
的相同字符串,因为它们都是ASCII字符

如果字符串只包含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已在数据库中
。(注意打印语句的正确方法,尽管您的语句完全有效。)因此您的问题在其他地方--
locked
表示有其他东西正在写入数据库。和我一样,尝试使用内存中的数据库,这样您就可以确定没有其他东西在访问它。如果这样做有效,那么您的问题就是异常指示的内容——其他东西正在访问数据库。

哦,好了,现在我明白了!我试着在SQLite Manager firefox加载项中查看它,结果行很好。。。我的意思是,它们在没有美国国旗的情况下展出。我猜在命令提示符中,它也显示了它的编码格式。好!!现在我明白了。可能要更新代码段中的变量名,这样就可以清楚地知道,这实际上与错误中的行是同一行?是的,我更新了变量名。对不起,我以前应该做的。Val1与我尝试在col1中插入两次的值相同。Col1是一个主键。天知道发生了什么Lol现在,我再次执行了我的程序,在给它5分钟的休息后,现在一切正常了。但是我真的很想知道是什么导致了DB锁,尽管它现在工作正常。嗨,谢谢!您还提到了打印语句的正确方法,尽管您的方法完全有效。所以我想知道最好的方法是什么?你是说在打印语句中使用+不是正确的方法吗?而是使用?我想听听你要说什么。谢谢当您对字符串使用
+
时,您正在创建一个新字符串。这涉及到复制旧字符串。当您使用
打印
时,没有理由这样做
print
将自动将内容格式化为字符串,并在有逗号的位置插入空格(除非行尾有逗号,否则在行尾有换行符)。如果
val1
是一个int,
print val1,string
可以工作,而
print val1+string
不能工作,则必须
print str(val1)+string