我建立动态查询,以便我事先不知道表名称和表字段。我这样做是为了以编程方式将数据从一个任意表导出到另一个表。因此,我的算法作为源表的参数名称,目标表的名称以及从一个系统表获取字段映射(从一个表到另一个表)作为参数名。我几乎做到了。我从源表构建了一个选择查询,所以我可以做

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(我的模型只有一列,标记类型)

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/

10-12 16:42
查看更多