我构建了动态查询,因此我事先并不知道表名和表字段。我这样做是为了以编程方式将数据从一个任意表导出到另一个表。因此,我的算法获取作为源表的参数名称,目标表的名称,并从一个系统表获取字段映射(从一个表到另一个表)。我几乎做到了。我从源表构建了一个select查询,所以我可以做
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
现在我想用select查询返回的值替换那些%s,%s,%s。像这样的东西(不起作用,但展示我想要的东西):
cursor.execute(selectquery)
for row in cursor:
final_query = template_query % row # <- I want this substitution
cursor2.execute(final_query)
答案 0 :(得分:1)
您可以使用kwargs动态更新查询集。
kwargs = {'name': "Jenny", 'color': "Blue"}
print People.objects.filter(**kwargs)
我不确定这会对动态命名的表有所帮助。也许这样的事情会有所帮助:http://dynamic-models.readthedocs.org/en/latest/(它是那个kwarg例子的来源)。
答案 1 :(得分:1)
我使用类似的东西。你需要做的是用__getitem__装饰/包装行,然后在模板的值中使用%(colname)而不是%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
然后你可以免除Wrapper,因为你的行已经改为字典了。
这是一个非常天真的实现,不适合大批量,但它的工作原理。