【发布时间】:2019-10-11 18:37:35
【问题描述】:
我有一个带有 1 个表和许多列的 SQLite3 数据库。这些列是 REAL、INTEGERS 和 TEXT 的混合。一些文本条目包含日期时间。
我想在表格中插入行而不添加重复项。该表的列比我插入的数据多。为此,我想首先在表中查询包含我要插入的所有数据的任何行。如果表中不包含具有匹配参数集的行,则插入该行。
如果表当前有 2 行并且如下所示:
a, b, c, d
2019-09-20 00:00:00, 1.1, 'DOG', nan
2019-10-20 10:00:00, 2.2, 'CAT', -2000
插入一行很简单:
insert_vals = [datetime.datetime(2019, 9, 27, 0, 0), 123.4, 'DOG']
column_names = ['a', 'b', 'c']
strDBInsert = "INSERT INTO table_name ({}) VALUES ({})".format(column_names, strQuestions)
conn = sqlite3.connect('db_name.db')
c= conn.cursor()
c.execute(strDBquery, insert_vals)
conn.commit()
但是,是否可以像下面类似的方式查询数据库?
strDBquery = "SELECT * FROM table_name WHERE {} LIKE {}".format(column_names, insert_vals)
c.execute(strDBquery, insert_vals)
queryData = c.fetchall()
我得到的错误是
sqlite3.OperationalError: near ",": syntax error
我希望输出:
print(queryData)
Output: [datetime.datetime(2019, 9, 27, 0, 0), 123.4, 'DOG', nan]
我认为我需要选择的另一个选项是:
c.execute("SELECT * FROM table_name WHERE a == datetime.datetime(2019, 9, 27, 0, 0), AND b == 123.4 AND c == DOG")
关于更多上下文,我正在使用 python 和 pandas 来读取包含股票交易的 csv,并且我想用新交易更新数据库。然后我想在该交易表中填写其他信息,并使用数据库中的另一个表来保存投资组合信息。也许有一种更简单的方法可以在没有查询然后插入选项的情况下完成大部分操作。
其他一些类似的问题:
【问题讨论】:
-
也许另一种选择只是构建一个带有列标题和值的字符串
conditions = " AND ".join("{0} == {1}".format(x,y) for x,y in zip(column_names,insert_vals)) -
现在最后的提示:如果您在构造 SQL 语句时遇到问题,第一步应该始终是检查(即打印和查看)完整的 SQL 字符串。这直接触及了问题的核心,而不是猜测各种代码可能会做什么。目标是创建格式正确的 SQL,那么为什么不直接查看呢?在执行之前查看
strDBquery的最终值,看看它的样子。这些细节也应该包含在 Stack Overflow 上的问题中。编辑问题以添加此类详细信息。 -
主要问题是有效的,但头脑风暴的风格是......呃......在 Stack Overflow 上不是传统的。如果您有想法(例如各种选项和其他 SO 问题),那么最好先尝试一下,如果所有可能的解决方案都没有按预期运行,请提出问题。所有选项都非常接近工作,但只是有小的语法问题或误解,所以感觉就像您要求我们修复您的拼写错误和语法错误......通常可以通过审查和研究自己发现的细节语法等