我构建动态查询,因此我事先不知道表名和表字段。我这样做是为了以编程方式将数据从一个任意表导出到另一个表。因此,我的算法获取源表名称、目标表名称作为参数,并从一个系统表获取字段映射(从一个表到另一个表)。我差一点就做到了。我从源表中构建了一个选择查询,所以我可以这样做
cursor.execute(selectquery)
for row in cursor:
... do something with rows
此外,我还为目标表构建了一个插入查询模板,所以它看起来像
insert into sourcetable (attr1,attr2,attr3) values (%s,%s,%s) # let me call it template_query
现在我想用选择查询返回的值替换这些 %s、%s、%s。像这样的东西(这不起作用,但展示了我想要的):
cursor.execute(selectquery)
for row in cursor:
final_query = template_query % row # <- I want this substitution
cursor2.execute(final_query)
最佳答案
我使用类似的东西。您需要做的是用 __getitem__ 装饰/包装行,然后在模板的值中使用 %(colname)s 而不是 %s。
class Wrapper(object):
def __init__(self,o):
self.o = o
def __getitem__(self,key):
try:
return getattr(self.o, key)
except AttributeError:
raise KeyError, key
然后,使用 django shell(我的模型只有一列,tagtype)
python manage.py shell
>>> from wrapper import Wrapper
>>> from pssystem.models import MetaTag
>>> o = MetaTag.objects.all()[0]
>>> w = Wrapper(o)
>>> "insert into sourcetable (attr1,attr2,attr3) values ('%(tagtype)s','%(tagtype)s, '%(tagtype)s)" % w
u"insert into sourcetable (attr1,attr2,attr3) values ('PROFILE','PROFILE, 'PROFILE)"
您可以比这更奇特(如果源对象包含不受信任的用户输入的内容,您绝对应该这样做),但这工作得很好。
请注意,如果替换是字符变量,则需要在替换周围添加引号。约会也可能很有趣!
嗯,抱歉,刚刚注意到您的源行来自直接选择,而不是从 Django 模型获取。 Django 标签让我很困惑——你的问题中几乎没有提到 Django。那么,它仍然有效,但您首先需要对光标的结果行执行一些操作。
像这样的事情就可以解决问题:
def fmtRow(cursor, row):
di = dict()
for i, col in enumerate(cursor.description):
di[col] = row[i]
return di
然后您可以省去包装器,因为您的行已经更改为字典。
这是一个非常幼稚的实现,不适合大容量,但它确实有效。
关于python - 获取查询结果作为元组进行替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26931118/