使用Python3.x格式在一个字符串中打印列表、字符串和dict
我希望将查询数据库所需的字符串格式化如下:使用Python3.x格式在一个字符串中打印列表、字符串和dict,python,python-3.x,string,string-formatting,Python,Python 3.x,String,String Formatting,我希望将查询数据库所需的字符串格式化如下: SELECT "field1", "field2" FROM "measurement" where "status"=0 AND "node"='name1' LIMIT 10 conf = { 'fields': ['field1', 'field2'], 'measurement': 'measurement', 'limit': 10, 'tags': {'node': 'name1'} } QUERY = 'SEL
SELECT "field1", "field2" FROM "measurement" where "status"=0 AND "node"='name1' LIMIT 10
conf = {
'fields': ['field1', 'field2'],
'measurement': 'measurement',
'limit': 10,
'tags': {'node': 'name1'}
}
QUERY = 'SELECT "{}" FROM {} WHERE "status"=0 LIMIT {}'.format(
'","'.join(conf['fields'],
conf['measurement'],
conf['limit'])
以下内容出自一条格言:
,field1
field2
测量
和节点
名称1
10
SELECT "field1", "field2" FROM "measurement" where "status"=0 AND "node"='name1' LIMIT 10
conf = {
'fields': ['field1', 'field2'],
'measurement': 'measurement',
'limit': 10,
'tags': {'node': 'name1'}
}
QUERY = 'SELECT "{}" FROM {} WHERE "status"=0 LIMIT {}'.format(
'","'.join(conf['fields'],
conf['measurement'],
conf['limit'])
我可以将字符串格式化为字符串的一部分(不带标记
),如下所示:
SELECT "field1", "field2" FROM "measurement" where "status"=0 AND "node"='name1' LIMIT 10
conf = {
'fields': ['field1', 'field2'],
'measurement': 'measurement',
'limit': 10,
'tags': {'node': 'name1'}
}
QUERY = 'SELECT "{}" FROM {} WHERE "status"=0 LIMIT {}'.format(
'","'.join(conf['fields'],
conf['measurement'],
conf['limit'])
这为我提供了:
SELECT "field1", "field2" FROM measurement WHERE "status"=0 LIMIT 10
问题
标记
中的键值对在许多情况下是动态的,即以前没有已知的键
(在本例中为节点
)
对于字符串:
QUERY = 'SELECT {} FROM {} WHERE "status"=0 AND "{}"=\'{}\' LIMIT {}
我希望动态地填充字符串格式和“{}”=\'{}\'
(事先不知道标记中的键值对
我如何做到这一点
我不确定是否:
QUERY = 'SELECT "{}" FROM {} WHERE "status"=0 AND "{}"=\'{}\' LIMIT {}'.format(
'","'.join(conf['fields']),
conf['measurement'],
**conf['tags'],
conf['limit']
)
当它抛出以下语法错误时工作:
SyntaxError: positional argument follows keyword argument unpacking
我已经预先使用字典
conf['tags']
创建了格式化字符串,以便于应用于QUERY
conf = {
'fields': ['field1', 'field2'],
'measurement': 'measurement',
'limit': 10,
'tags': {'node': 'name1'}
}
#Create the string using dictionary
dict_str = ''.join('"{}"=\'{}\''.format(key,value) for key, value in conf['tags'].items())
#Create the final format string
QUERY = 'SELECT "{}" FROM "{}" WHERE "status"=0 AND {} LIMIT {}'.format(
'","'.join(conf['fields']),
conf['measurement'],
dict_str,
conf['limit']
)
print(QUERY)
输出将是
SELECT "field1","field2" FROM "measurement" WHERE "status"=0 AND "node"='name1' LIMIT 10
如果您使用的是python 3.6及更高版本,则有一种使用指定的f字符串进行字符串格式化的新方法。我不确定我是否理解您的请求,但我认为您的意思是:
key = list(conf['tags'].keys())[0]
QUERY = f"""SELECT {conf['fields'][0]}, {conf['fields'][1]} FROM "{conf['measurement']}" WHERE "status"=0 AND "{key}"='{conf['tags'][key]}' LIMIT {conf['limit']}"""
这将导致以下字符串:
SELECT "field1", "field2" FROM "measurement" WHERE "status"=0 AND "node"='name1' LIMIT 10
你的
conf
是什么样子的,你能补充一下吗?它已经被添加了:参见conf
dict@Shan-Desai是标记
始终只有一个键值对?@Adam.Er8对于初始情况是。如果我们使用,您的第一个字符串只能用python表示“
,既然其中都有单引号和双引号,对吗?为什么有”节点?”='name1'
而不是node=name1
?对我来说很有用!我查看了客户机库,可能有一些东西,其中一个是对所有内容进行一般查询,然后使用标记
dict对其进行解析,但您的解决方案更干净,更易于使用。