Python Sqlite3:插入表VALUE(字典在这里) - python

我想使用字典将值插入表中,该怎么做?

import sqlite3

db = sqlite3.connect('local.db')
cur = db.cursor()

cur.execute('DROP TABLE IF EXISTS Media')

cur.execute('''CREATE TABLE IF NOT EXISTS Media(
                id INTEGER PRIMARY KEY, title TEXT, 
                type TEXT,  genre TEXT,
                onchapter INTEGER,  chapters INTEGER,
                status TEXT
                )''')


values = {'title':'jack', 'type':None, 'genre':'Action', 'onchapter':None,'chapters':6,'status':'Ongoing'}

#What would I Replace x with to allow a 
#dictionary to connect to the values? 
cur.execute('INSERT INTO Media VALUES (NULL, x)'), values)
cur.execute('SELECT * FROM Media')

meida = cur.fetchone()

print meida

参考方案

如果您尝试使用dict来指定列名和值,则不能这样做,至少不能直接这样做。

这实际上是SQL固有的。如果不指定列名列表,则必须以CREATE TABLE顺序指定它们,而dict则不能这样做,因为dict没有顺序。当然,如果您确实想要,可以使用collections.OrderedDict,确保其顺序正确,然后只需传递values.values()即可。但是在那时候,为什么不首先拥有list(或tuple)呢?如果您完全确定已按正确的顺序获取了所有值,并且希望按顺序而不是按名称引用它们,那么您拥有的是list而不是dict

而且,无法绑定SQL中的列名(或表名等),仅绑定值。

当然,您可以动态生成SQL语句。例如:

columns = ', '.join(values.keys())
placeholders = ', '.join('?' * len(values))
sql = 'INSERT INTO Media ({}) VALUES ({})'.format(columns, placeholders)
cur.execute(sql, values.values())

但是,这几乎总是一个坏主意。这确实比生成并exec动态Python代码更好。首先,您已经失去了使用占位符的所有好处—主要是防止SQL注入攻击,但又减少了数据库引擎中不太重要的事情,例如更快的编译,更好的缓存等。

最好退一步并从更高的角度来看这个问题。例如,也许您并不是真的想要一个静态的属性列表,而是一个名称-值MediaProperties表?或者,或者,也许您想要某种基于文档的存储(无论是功能强大的nosql系统,还是只是存储在shelve中的一堆JSON或YAML对象)?

另一种使用named placeholders的方法:

columns = ', '.join(my_dict.keys())
placeholders = ':'+', :'.join(my_dict.keys())
query = 'INSERT INTO my_table (%s) VALUES (%s)' % (columns, placeholders)
print query
cur.execute(query, my_dict)
con.commit()

在返回'Response'(Python)中传递多个参数 - python

我在Angular工作,正在使用Http请求和响应。是否可以在“响应”中发送多个参数。角度文件:this.http.get("api/agent/applicationaware").subscribe((data:any)... python文件:def get(request): ... return Response(seriali…

Python exchangelib在子文件夹中读取邮件 - python

我想从Outlook邮箱的子文件夹中读取邮件。Inbox ├──myfolder 我可以使用account.inbox.all()阅读收件箱,但我想阅读myfolder中的邮件我尝试了此页面folder部分中的内容,但无法正确完成https://pypi.python.org/pypi/exchangelib/ 参考方案 您需要首先掌握Folder的myfo…

python JSON对象必须是str,bytes或bytearray,而不是'dict - python

在Python 3中,要加载以前保存的json,如下所示:json.dumps(dictionary)输出是这样的{"('Hello',)": 6, "('Hi',)": 5}当我使用json.loads({"('Hello',)": 6,…

R'relaimpo'软件包的Python端口 - python

我需要计算Lindeman-Merenda-Gold(LMG)分数,以进行回归分析。我发现R语言的relaimpo包下有该文件。不幸的是,我对R没有任何经验。我检查了互联网,但找不到。这个程序包有python端口吗?如果不存在,是否可以通过python使用该包? python参考方案 最近,我遇到了pingouin库。

Python ThreadPoolExecutor抑制异常 - python

from concurrent.futures import ThreadPoolExecutor, wait, ALL_COMPLETED def div_zero(x): print('In div_zero') return x / 0 with ThreadPoolExecutor(max_workers=4) as execut…