我有一个python列表,比如l
l = [1,5,8]
Run Code Online (Sandbox Code Playgroud)
我想编写一个sql查询来获取列表中所有元素的数据
select name from students where id = |IN THE LIST l|
Run Code Online (Sandbox Code Playgroud)
我该如何做到这一点?
我在Python中执行某些SQL时遇到问题,尽管类似的SQL在mysql命令行中工作正常.
该表如下所示:
mysql> SELECT * FROM foo;
+-------+-----+
| fooid | bar |
+-------+-----+
| 1 | A |
| 2 | B |
| 3 | C |
| 4 | D |
+-------+-----+
4 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
我可以从mysql命令行执行以下SQL查询,没有问题:
mysql> SELECT fooid FROM foo WHERE bar IN ('A','C');
SELECT fooid FROM foo WHERE bar IN ('A','C');
+-------+
| fooid |
+-------+
| 1 |
| 3 |
+-------+
2 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试在Python中执行相同操作时,我没有获得任何行,而我期望有2行: …
你会如何在PHP中编写一个准备好的MySQL语句,每次都需要不同数量的参数?这种查询的一个例子是:
SELECT `age`, `name` FROM `people` WHERE id IN (12, 45, 65, 33)
Run Code Online (Sandbox Code Playgroud)
该IN子句id每次运行时都会有不同数量的s.
我脑子里有两种可能的解决方案,但想看看是否有更好的方法.
可能的解决方案1使语句接受100个变量,并使用保证不在表中的虚拟值填充其余变量; 多次调用超过100个值.
可能的解决方案2不要使用准备好的声明; 构建并运行查询严格检查可能的注入攻击.
以下作品:
>>> cursor.execute("select * from sqlitetable where rowid in (2,3);")
Run Code Online (Sandbox Code Playgroud)
以下不是:
>>> cursor.execute("select * from sqlitetable where rowid in (?) ", [[2,3]] )
sqlite3.InterfaceError: Error binding parameter 0 - probably unsupported type.
Run Code Online (Sandbox Code Playgroud)
有没有办法传入python列表而不必先将其格式化为字符串?
我想在我的数据库中插入一个列表,但我不能.
这是我需要的一个例子:
variable_1 = "HELLO"
variable_2 = "ADIOS"
list = [variable_1,variable_2]
INSERT INTO table VALUES ('%s') % list
Run Code Online (Sandbox Code Playgroud)
可以这样做吗?我可以将列表作为值插入吗?当我尝试它时,错误说是因为MySQL语法中的错误
有没有人知道是否有办法自动扩展Python中的列表,用逗号分隔?我正在编写一些使用MySQLdb库的Python代码,我正在尝试使用某些键值动态更新MySQL数据库中的行列表.
例如,在下面的代码中,我想让record_ids列表中的数值扩展为SQL" IN"子句.
import MySQLdb
record_ids = [ 23, 43, 71, 102, 121, 241 ]
mysql = MySQLdb.connect(user="username", passwd="secret", db="apps")
mysql_cursor = mysql.cursor()
sqlStmt="UPDATE apps.sometable SET lastmod=SYSDATE() where rec_id in ( %s )"
mysql_cursor.execute( sqlStmt, record_ids )
mysql.commit()
Run Code Online (Sandbox Code Playgroud)
任何帮助,将不胜感激!
我在python中有一个列表.
article_ids = [1,2,3,4,5,6]
Run Code Online (Sandbox Code Playgroud)
我需要在sql语句中使用这个列表,如下所示:
SELECT id FROM table WHERE article_id IN (article_ids)
Run Code Online (Sandbox Code Playgroud)
我怎样才能将这个清单提供给我的IN()条款?
我已经尝试了一些谷歌搜索方式,但我无法理解.
>> print ids_list
placeholders= ', '.join('?'*len(ids_list)) # "?, ?, ?, ... ?"
query = 'SELECT article_id FROM article_author_institution WHERE institution_id IN ({})'.format(placeholders)
print query
cursor.execute(query, ids_list)
Run Code Online (Sandbox Code Playgroud)
我得到的错误消息:
SELECT article_id FROM article_author_institution WHERE institution_id IN (?)
query = query % db.literal(args)
TypeError: not all arguments converted during string formatting
Run Code Online (Sandbox Code Playgroud)
例如:
ids_list = [9,10]
placeholders= ', '.join('%'*len(ids_list)) # "?, ?, ?, ... ?"
query = …Run Code Online (Sandbox Code Playgroud) 我的意思是这样的:
from django.db import connection
cursor=connection.cursor()
cursor.execute('SELECT * FROM mytable where id IN (%s)', [params])
Run Code Online (Sandbox Code Playgroud)
参数不能只是可迭代的——它不起作用。由于数据库处理程序转义值,因此也不能采用 CSV 格式。
如何在 中使用占位符IN?
CSV 是错误的,我的意思是params=['1','2','3','4','5']
c.execute('select * from mytable where id in (%s)', [','.join(params)])
Run Code Online (Sandbox Code Playgroud)
将产生:
select * from mytable where id in ('1,2,3,4,5')
Run Code Online (Sandbox Code Playgroud)
但正确的sql是:
select * from mytable where id in (1,2,3,4,5)
Run Code Online (Sandbox Code Playgroud)
而且用占位符似乎很难实现。
我需要在我正在编写的Django应用程序中使用原始SQL查询.SQL查询in在where语句中包含一个子句:
select *
from abc_mymodel
where some_fk in (1,2,3)
and some_status = 'foo'
Run Code Online (Sandbox Code Playgroud)
我是将SQL参数作为参数传递的重要支持者.对于单值的数据,这很容易做到.但是,我不确定如何(或是否)可以为in子句做这件事.理想情况下,我想做的事情如下:
sql = """
select *
from abc_mymodel
where some_fk in %s
and some_status = %s
"""
my_list = [1,2,3]
my_status = 'foo'
trinkets = MyModel.objects.raw(
sql,
params=(my_list, my_status)
)
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用字符串组合来编写in子句并使用参数来表示剩余的值.但是,我很好奇是否可以使用params作为in条款.
我阅读了几个示例,这些示例展示了 pymysql“选择输入”应该如何工作。所以,这个例子工作得很好:
sql_select = 'SELECT a.user_id, AVG(a.rcount) AS \'average\' ' \
'FROM (SELECT user_id, item_id, count(*) AS rcount ' \
'FROM submission AS qsm ' \
'JOIN metadata as qm ' \
'ON qsm.item_id = qm.id ' \
'WHERE qsm.item_id NOT IN (1, 2, 5, 6, 7, 147, 148) ' \
'AND DATE(FROM_UNIXTIME(submission_time)) BETWEEN %s AND %s ' \
'AND qm.type != \'survey\' ' \
'GROUP BY user_id, item_id ' \
'ORDER BY user_id) a ' \
'GROUP BY a.user_id' …Run Code Online (Sandbox Code Playgroud) 我需要在python中将一批参数传递给mysql。这是我的代码:
sql = """ SELECT * from my_table WHERE name IN (%s) AND id=%(Id)s AND puid=%(Puid)s"""
params = {'Id':id,'Puid' : pid}
in_p=', '.join(list(map(lambda x: '%s', names)))
sql = sql %in_p
cursor.execute(sql, names) #todo: add params to sql clause
Run Code Online (Sandbox Code Playgroud)
问题是我想将名称列表传递给 sql IN 子句,同时我还想将 id 和 puid 作为参数传递给 sql 查询子句。我如何在 python 中实现这些?
python ×9
mysql ×5
sql ×5
django ×2
database ×1
django-orm ×1
in-clause ×1
list ×1
parameters ×1
php ×1
placeholder ×1
pymysql ×1
sqlite ×1