我有一个像这样的简单数组:
a=['a','b','c']
我需要将所有“a”元素插入到Mysql表'items'和列'names'中,以避免插入元素(如果它已经存在于'names'列中,避免迭代和多个INSERT查询。
由于
答案 0 :(得分:1)
1)您可以使用MySQL特定的INSERT ... ON DUPLICATE KEY UPDATE语法。 (我假设列'名称'上有PRIMARY KEY或UNIQUE KEY)
(另外:a = list(set(a)) #to remove duplicates in a
)。
a = ['a', 'b', 'c']
c = conn.cursor()
c.executemany('INSERT INTO items (name) VALUES (%s) ON DUPLICATE KEY UPDATE name = name', a)
2)如果列'name'上没有唯一性constriaint,您可以检查数据库中已有哪些名称,并从列表中删除它们以插入:
a = ['a', 'b', 'c']
c = conn.cursor()
c.execute('SELECT names from items')
existent_names = [name[0] for name in c]
a = list(set(a) - set(existent_names))
c.executemany('INSERT INTO items (name) VALUES (%s)', a)
答案 1 :(得分:0)
嗨,如果你不想在你的表'items'中有重复的'names',那么这应该是你的主键,当你尝试插入重复值时,mysql根本不会允许它。但是,如果您为表使用不同的主键,此代码可能会对您有所帮助:
import MySQLdb
conn = MySQLdb.connect(host= "localhost",
user="root",
passwd="yourpass",
db="yourdb")
x = conn.cursor()
a=['a','b','c']
for i in range (0,len(a))
try:
data = x.execute("""SELECT name FROM items WHERE name=%s """, a[i])
data = cursor.fetchone()
if data == None:
x.execute("""INSERT INTO items(name) VALUES(%s)""",a[i])
conn.commit()
except:
conn.rollback()
答案 2 :(得分:0)
这是我从你的帖子中理解的。您希望将列表中的唯一值添加到数据库中。您可以使用python的set
。
a = ['a', 'b', 'c']
set_a = list(set(a))
inset_into_db(set_a)
答案 3 :(得分:0)
如果持有所有items.names
的内存成本不高,您可以运行查询以选择所有items.names
并将其保存在一个集合中。
cursor.execute('SELECT names from items')
names_set = set(name[0] for name in cursor)
在执行查询之前,请过滤掉此集合中的现有名称。
fresh_a = filter(lambda v: v not in names_set, a)
如果您担心a
中的重复名称,可以将其投射到一组。