2014-11-14 48 views
1

我構建動態查詢,以便事先不知道表名和表字段。我這樣做是爲了以編程方式將數據從一個任意表格導出到另一個表格。所以,我的算法獲取作爲源表的參數名稱,目標表的名稱,並從一個系統表獲取字段映射(從一個表到另一個表)。我幾乎做到了。我內置從源表中選擇查詢,所以我可以做獲取查詢結果作爲元組進行替換

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與select查詢返回的值。像這樣的東西(這不起作用,但演示了我想要的):

cursor.execute(selectquery) 
for row in cursor: 
    final_query = template_query % row # <- I want this substitution 
    cursor2.execute(final_query) 

回答

1

我使用類似的東西。你需要做的是用__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的殼(我的模型有一列,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 

,然後你可以用包裝免除,因爲你行改爲字典了。

這是一個非常幼稚的實現,不適合於大容量,但它的工作原理。

1

您可以使用kwargs動態更新查詢集。

kwargs = {'name': "Jenny", 'color': "Blue"} 
print People.objects.filter(**kwargs) 

雖然我不確定這有助於動態命名錶。也許這樣會有所幫助:http://dynamic-models.readthedocs.org/en/latest/(這是kwarg的例子來自哪裏)。