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