使用SELECT和INSERT等参数查询SQLite3数据库

2024-10-03 13:27:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个SQLite3数据库,有一个表和许多列。列是实数、整数和文本的混合。一些文本条目包含日期时间。你知道吗

我想在表中插入行而不添加重复项。表中的列比我插入的数据多。为此,我想首先查询表中包含我要插入的所有数据的任何行。如果表中不包含具有匹配参数集的行,则插入该行。你知道吗

如果表当前有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,并且我想用新的交易更新一个数据库。然后我想将其他信息填充到那个transactions表中,并使用数据库中的另一个表来保存投资组合信息。也许有一种更简单的方法可以在不使用查询然后插入选项的情况下完成大多数操作。你知道吗

其他一些类似的问题:

SQLite3 querying a database with '?' placeholders

SQLite3 LIKE query with UTF-8 encoding


Tags: 数据name文本数据库executedatetimenamestable
1条回答
网友
1楼 · 发布于 2024-10-03 13:27:40

当出现语法和参数的问题时,首先去文档。一般来说,答案不是针对完整的教程,但是问题和示例有许多语法错误,因此下面的段落将解释一些基本的sqlite SQL概念。要继续编写这样的代码并避免如此多的问题,应该学习SQL语法。你知道吗

字符串值must be in quotes,就像任何其他编程语言一样。类似c == DOG的内容将被解释为数据库对象或关键字,而不是值。你知道吗

LIKE operator用于将字符串与模式匹配。它不一定有利于一般价值观的平等比较。它也不是用于比较任何数据类型的值的自动运算符。它支持单个参数,不支持参数列表。如果需要匹配多个字符串,则必须包含多个LIKE语句,每个列和/或比较对应一个。你知道吗

没有实际的日期或时间data types for sqlite。有functions用于处理日期,但它们用于生成作为字符串和/或数字朱利安表示形式的日期值。预期的字符串格式是ISO-8601格式,如YYYY-MM-DD HH:MM:SS.SSS。有一个datetime()函数,但它不接受问题中猜测的参数。也没有从SQL中引用宿主语言函数,因此datetime.datetime()之类的函数不起作用。你知道吗

小心散乱的逗号。你知道吗


这个猜测中的整体模式最接近于一个好的解决方案:

c.execute("SELECT * FROM table_name WHERE a == datetime.datetime(2019, 9, 27, 0, 0), AND b == 123.4 AND c == DOG")

该声明的更正版本如下所示。datetime比较将作为与列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_namesinsert_vals这样的列表生成,但是由于数据类型不同,它不会像其他猜测那样是一个简单、统一的分隔符。您需要某种形式的数据类型条件来为每列准备比较表达式。你知道吗

相关问题 更多 >