python - 获取查询结果作为元组进行替换

标签 python sql django

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

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/

相关文章:

python - 如何从 Django 中的查询集中检索值?

python - 如何在 wxpython 网格中以最快的方式设置最佳列宽?

python - 使用 Django 将 Unicode 子类存储到 MySQL

python - 前后端分离时的Django CSRF

python - 如何使用 OOP 将小部件放置到 Tkinter 中的不同框架中

python - 从现有的两个不同长度的数据框中填充新列

java - 来自不同调度作业的同一列版本

php - 检查行是否包含字符串中的子字符串

php - 了解准备好的语句 - PHP

python - 如何将 Django 项目迁移到 Pythonanywhere