Python 在Sqlite3中存储字典的字典

Python 在Sqlite3中存储字典的字典,python,sqlite,Python,Sqlite,假设我把一本字典放到另一本字典里,比如- dict={ 'Prem': { 'age' : '23' , 'sex': 'male' } , 'Sameer' : { 'age' : '22' , 'sex' : 'male'} } 。我们如何将其存储到Sqlite3数据库中?您需要两个表 首先,对于exmpl人员: id name 1 Prem 2 Sameer ... 第二存储值: id fk_persons age sex 1 1 23 male 2 2

假设我把一本字典放到另一本字典里,比如-

dict={ 'Prem': { 'age' : '23' , 'sex': 'male' } , 'Sameer' : { 'age' : '22' , 'sex' : 'male'} }
。我们如何将其存储到Sqlite3数据库中?

您需要两个表

首先,对于exmpl人员:

id name
1  Prem  
2  Sameer
...
第二存储值:

id fk_persons age sex
1  1          23  male
2  2          22  male
通常结构是字典的表格。

您需要两个表格

首先,对于exmpl人员:

id name
1  Prem  
2  Sameer
...
第二存储值:

id fk_persons age sex
1  1          23  male
2  2          22  male

通常字典的结构是表。

关系数据存储在表中。你没有说内部指令是否总是具有相同的结构,所以为了这个答案,我假设它们具有相同的结构

在这些情况下,定义一个包含三列的表是最简单的,我称之为
name
age
sex
。这个定义看起来像

CREATE TABLE t(
    name    VARCHAR(20),
    age     INTEGER,
    sex     CHAR(1))
输入样本数据的程序如下所示:

import sqlite3
mydict={'Prem': { 'age': '23' , 'sex': 'male' },
        'Sameer' : { 'age': '22' , 'sex': 'male'}
       } # reformatted to `PEP008` standard, renamed

conn = sqlite3.connect("/tmp/db") # creates a new file if necessary
curs = conn.curs()
for k in mydict:
    curs.execute("""INSERT INTO t (name, age, sex)
                    VALUES (?, ?, ?)""",
                    (k, mydict[k]['age'], mydict[k]['sex'])
conn.commit()
ogdict = { 'Prem': { 'age' : '23' , 'sex': 'male' } , 'Sameer' : { 'age' : '22' , 'sex' : 'male'} }
c.execute('INSERT INTO tablename VALUES ("{}")'.format(ogdict))
这将迭代
mydict
的键(我将其重命名,因为
dict
是内置类型的名称),并将键插入为
name
以及内部dict中的
age
sex


commit()
调用非常重要-这使数据库更改永久化

关系数据存储在表中。你没有说内部指令是否总是具有相同的结构,所以为了这个答案,我假设它们具有相同的结构

在这些情况下,定义一个包含三列的表是最简单的,我称之为
name
age
sex
。这个定义看起来像

CREATE TABLE t(
    name    VARCHAR(20),
    age     INTEGER,
    sex     CHAR(1))
输入样本数据的程序如下所示:

import sqlite3
mydict={'Prem': { 'age': '23' , 'sex': 'male' },
        'Sameer' : { 'age': '22' , 'sex': 'male'}
       } # reformatted to `PEP008` standard, renamed

conn = sqlite3.connect("/tmp/db") # creates a new file if necessary
curs = conn.curs()
for k in mydict:
    curs.execute("""INSERT INTO t (name, age, sex)
                    VALUES (?, ?, ?)""",
                    (k, mydict[k]['age'], mydict[k]['sex'])
conn.commit()
ogdict = { 'Prem': { 'age' : '23' , 'sex': 'male' } , 'Sameer' : { 'age' : '22' , 'sex' : 'male'} }
c.execute('INSERT INTO tablename VALUES ("{}")'.format(ogdict))
这将迭代
mydict
的键(我将其重命名,因为
dict
是内置类型的名称),并将键插入为
name
以及内部dict中的
age
sex


commit()
调用非常重要-这使数据库更改永久化

您可以将字典另存为type
TEXT
,因此它将另存为:

"{ 'Prem': { 'age' : '23' , 'sex': 'male' } , 'Sameer' : { 'age' : '22' , 'sex' : 'male'} }"
您可以将其保存在数据库中,如下所示:

import sqlite3
mydict={'Prem': { 'age': '23' , 'sex': 'male' },
        'Sameer' : { 'age': '22' , 'sex': 'male'}
       } # reformatted to `PEP008` standard, renamed

conn = sqlite3.connect("/tmp/db") # creates a new file if necessary
curs = conn.curs()
for k in mydict:
    curs.execute("""INSERT INTO t (name, age, sex)
                    VALUES (?, ?, ?)""",
                    (k, mydict[k]['age'], mydict[k]['sex'])
conn.commit()
ogdict = { 'Prem': { 'age' : '23' , 'sex': 'male' } , 'Sameer' : { 'age' : '22' , 'sex' : 'male'} }
c.execute('INSERT INTO tablename VALUES ("{}")'.format(ogdict))
然后使用内置python
eval()
功能将其转换回字典:

c.execute('SELECT * FROM tablename')
dbdict = eval(c.fetchone()[0])

现在,数据库中的字典保存在
dbdict
中,您可以像使用普通字典一样使用它,因此调用
dbdict['Prem']
将产生
{'age':'23','sex':'male'}
您可以将字典保存为type
TEXT
,因此它将保存为:

"{ 'Prem': { 'age' : '23' , 'sex': 'male' } , 'Sameer' : { 'age' : '22' , 'sex' : 'male'} }"
您可以将其保存在数据库中,如下所示:

import sqlite3
mydict={'Prem': { 'age': '23' , 'sex': 'male' },
        'Sameer' : { 'age': '22' , 'sex': 'male'}
       } # reformatted to `PEP008` standard, renamed

conn = sqlite3.connect("/tmp/db") # creates a new file if necessary
curs = conn.curs()
for k in mydict:
    curs.execute("""INSERT INTO t (name, age, sex)
                    VALUES (?, ?, ?)""",
                    (k, mydict[k]['age'], mydict[k]['sex'])
conn.commit()
ogdict = { 'Prem': { 'age' : '23' , 'sex': 'male' } , 'Sameer' : { 'age' : '22' , 'sex' : 'male'} }
c.execute('INSERT INTO tablename VALUES ("{}")'.format(ogdict))
然后使用内置python
eval()
功能将其转换回字典:

c.execute('SELECT * FROM tablename')
dbdict = eval(c.fetchone()[0])

现在,数据库中的字典保存在
dbdict
中,您可以像普通字典一样使用它,因此调用
dbdict['Prem']
将产生
{'age':'23','sex':'male'}
,因为名称是一个键。所以最好把它放在别处。为什么?似乎没有什么好的理由在两个表之间强制连接,因为主ket始终会被索引,例如,是的,我们可以使用一个表,唯一索引超过名称。但是最好将键存储在其他表中,这可以提高dml操作的速度我知道整数键对于连接更有效,而且许多关系用户更喜欢使用系统控制下的整数键,而不是用户数据控制下的整数键,但我仍然不明白,与从一个表中检索相比,连接两个表将如何提高速度。为什么您“需要”两个表?从一个表中加入或选择不会损失或提高速度。但如果试图对一个表执行dml操作,然后对带有keyname的表执行dml操作,则会失败,因为name是一个键。所以最好把它放在别处。为什么?似乎没有什么好的理由在两个表之间强制连接,因为主ket始终会被索引,例如,是的,我们可以使用一个表,唯一索引超过名称。但是最好将键存储在其他表中,这可以提高dml操作的速度我知道整数键对于连接更有效,而且许多关系用户更喜欢使用系统控制下的整数键,而不是用户数据控制下的整数键,但我仍然不明白,与从一个表中检索相比,连接两个表将如何提高速度。为什么您“需要”两个表?从一个表中加入或选择不会损失或提高速度。但是,如果试图在一个表上执行dml操作,然后在一个带有注释记号的表上执行dml操作,则会失败,因为仅使用给定名称作为主键会使您陷入麻烦,因为键需要唯一,并且给定名称的数量有限。请注意,仅使用给定名称作为主键会使您陷入麻烦,因为键需要唯一,而且给出的名字数量有限。