我有一个带有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,并且我想使用新交易更新数据库。然后,我想在该交易表中填写其他信息,并使用数据库中的另一个表来保存投资组合信息。也许有一种更简单的方法来执行大多数操作,而无需查询,然后插入选项。
其他一些相似的问题:
答案 0 :(得分:0)
当出现语法和参数问题时,请先去看文档。通常,SO答案并不适用于完整的教程,但是问题和示例均包含许多语法错误,因此以下各段说明了一些基本的sqlite SQL概念。为了继续编写此类代码并避免出现许多问题,应该研究SQL语法。
字符串值must be in quotes,就像其他任何编程语言一样。像c == DOG
之类的东西会被解释为DOG是数据库对象或关键字,而不是值。
LIKE operator用于将字符串匹配到模式。对于一般价值的平等比较不一定是好事。它也不是比较任何数据类型的值的自动运算符。它支持单个参数,而不是参数列表。如果需要匹配多个字符串,则必须包括多个LIKE语句,每个列和/或比较一个。
没有实际的日期或时间data types for sqlite。有functions用于处理日期,但它们用于生成日期值作为字符串和/或数字Julian表示形式。预期的字符串格式为ISO-8601格式,例如YYYY-MM-DD HH:MM:SS.SSS
。有一个datetime()
函数,但是它不接受问题中猜测的参数。还没有从SQL中引用宿主语言函数,因此,datetime.datetime()
之类的东西不起作用。
小心流浪逗号。
此猜测中的总体模式将最接近一个好的解决方案:
c.execute(“ SELECT * FROM table_name其中a == datetime.datetime(2019,9,27,0,0),AND b == 123.4 AND c == DOG”)
该语句的更正版本如下所示。日期时间比较将作为与列a
的字符串比较执行,因此,假定列a
以前是使用相同格式保存的。如果不是这样,则需要对所有datetime值进行不同的操作和比较。
c.execute("SELECT * FROM table_name WHERE a == datetime('2019-09-27 00:00:00') AND b == 123.4 AND c == 'DOG'")
当然可以从column_names
和insert_vals
之类的列表中生成该语句,但是由于数据类型不同,因此不会像其他猜测那样成为简单,统一的定界符。您需要某种形式的数据类型条件来为每一列准备比较表达式。