簡體   English   中英

Python,SQlite和字符串替換

[英]Python, SQlite and string substitution

我有一個問題,也許它在某個地方回答了,但我找不到答案。 因此,我得到了一個包含一個表組成的Sqlite數據庫,比方說電話型號和制造商:

Samsung
Apple
Iphone
Apple
Galaxy
Samsung
Ipod
Nexus

所以我想要實現的是制作一個腳本來代替:

Iphone or Ipod -> Apple
Galaxy or Nexus -> Samsung

我想擁有一個像字典這樣的數據結構(我知道該示例是不可能的,但僅用於說明),我可以從文件中讀取該數據結構以進行UPDATE查詢:

{
'Apple':'Iphone','Ipod'
'Samsung':'Galaxy','Nexus'}

因此,當腳本找到任何值時,它將用鍵替換它

值可以是很多-假設大約10,所以使用if / or語句將是不切實際的,而且我不需要每次都需要對代碼進行一些更改並對其進行更正-因此,這就是為什么我想保留我的“字典”文本文件並從腳本中讀取。

任何將我指向正確方向的想法,我將不勝感激

謝謝。

首先,您可以做一個將替換值映射到“原始值”列表的字典:

replacements = {
    'Apple':['Iphone','Ipod'],
    'Samsung':['Galaxy','Nexus']
}

您可以將其放入諸如mapping.py之類的文件中,並from mapping import replacements JSON也是一種合理的序列化格式。 獲得字典后,您可以遍歷所有字段,生成適合要替換的字符串長度的參數化查詢。

for replacement, replacables in replacements.iteritems():
    query = 'update foo set value=? where value in ({})'.format(",".join("?"*len(replacables)))
    c.execute(query, [replacement]+replacables)

這樣,您就不會獲得SQL注入。 當我嘗試時,它最多可以處理100個變量,而不能處理1000個變量。我還沒有檢查它到底能工作多少。

當心:以下不安全的SQL注入!

之前的數據庫:

$ sqlite3 foo.db .dump
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE t (f varchar);
INSERT INTO "t" VALUES('foo');
INSERT INTO "t" VALUES('bar');
INSERT INTO "t" VALUES('baz');
COMMIT;

映射的JSON文件:

{"B": ["bar", "baz"], "F": ["foo"]}

Python代碼:

import json
import sqlite3

d = json.loads("d.json")

con = sqlite3.connect("foo.db")
cur = con.cursor()

# Loop over the keys in d.
for k in d:
    # Build the SQL clause that matches all recordss for d[k].
    clause = " or ".join(" f = '{}' ".format(v) for v in d[k])
    # The SQL for the update.
    sql = "update t set f = '{}' where {}".format(k, clause)    
    cur.execute(sql)

con.commit()        

數據庫之后:

$ sqlite3 foo.db .dump
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE t (f varchar);
INSERT INTO "t" VALUES('F');
INSERT INTO "t" VALUES('B');
INSERT INTO "t" VALUES('B');
COMMIT;

如果您必須一口氣做很多替換,我建議您使用包含舊列和新列的臨時表

所以你的字典看起來像

蘋果手機

蘋果iPad

Nexus,三星

三星Galaxy

您可以使用批量加載器將此字典上傳到臨時表

將數據批量加載到sqlite嗎?

然后運行一個更新命令一次更新所有舊值

Oracle中SQL的要旨是

update yourtable
set yourtable.phone = (select temp.new
from yourtable , temp
where 
temp.old = yourtable.phone)
where exists
(
select 1 from yourtable , temp
where 
temp.old = yourtable.phone
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM