【发布时间】:2013-09-20 04:54:19
【问题描述】:
我希望使用 C# 和 python 客户端将 GUID 存储在我的 SQLite 数据库中。
创建数据库,插入一行,将 GUID 存储为字符串:
conn = sqlite3.connect(filename)
c = conn.cursor()
# Create the table. Yes, I know GUID isn't a real SQLite datatype.
c.execute('CREATE TABLE test (guid GUID PRIMARY KEY, name text)')
u = uuid.uuid4()
print u
t = (str(u), 'foo')
c.execute('INSERT INTO test VALUES (?,?)', t)
conn.commit()
conn.close()
获取:
# ...
c.execute('SELECT * FROM test WHERE guid = "c1332103-6031-4ff7-b610-f8f3b940fa66"')
print c.fetchone()
这一切都完美无缺。使用 UUID 的默认 Python __str__ 表示效果很好。
C:\Users\Jonathon>makedb.py test.db
c1332103-6031-4ff7-b610-f8f3b940fa66
C:\Users\Jonathon>opendb.py test.db
(u'c1332103-6031-4ff7-b610-f8f3b940fa66', u'foo')
我对使用SQLite Expert 产生了疑问。 SQLite Expert 似乎对我的 GUID 数据类型声明很满意:
但是,如果我编辑一行:
它似乎改变了数据类型!我之前的SELECT 产生None,如果我SELECT *,我发现它不再是一个简单的unicode 字符串:
C:\Users\Jonathon>opendb.py test.db
(<read-write buffer ptr 0x02239520, size 16 at 0x02239500>, u'foo')
查看磁盘上的数据,可以看到 GUID 是二进制存储的,SQLite Expert 触摸后:
之前 - GUID 是 ASCII 文本:
之后——之前的数据是垃圾,存在二进制版本的GUID:
那么“正确” 在 SQLite 中存储 GUID 的方法是什么,特别是使用 Python?稍后,我也会让 C# 代码与之交互,并希望确保我以“正确”的方式进行操作。
【问题讨论】:
-
不要将
GUID/UUID设为主键,使用单独的内部 id - 特别是如果您打算建立外键关系,请参阅 mail-archive.com/sqlite-users%40sqlite.org/msg27377.html -
SQLite(以及 SQLite 专家)对
GUID类型感到满意,因为 SQLite 不强制类型(INTEGER PRIMARY KEY字段除外)。 -
嗯,似乎有意见冲突:stackoverflow.com/questions/3272013/…
-
是的,但显然 SQLite Expert 对其进行了特殊处理。我应该将我的 GUID 存储为二进制 blob 而不是字符串吗?如果是这样的话,似乎会让 SELECT 变得更棘手。