Phương pháp dưới đây không lý tưởng lắm, nhưng, thật không may, đó là cách duy nhất tôi biết.
Ý tưởng là xây dựng SQL theo cách thủ công, sử dụng connection.literal
để thoát khỏi các đối số cho bạn:
cursor=connection.cursor()
args=[(1,'foo'),(2,'bar')]
sql=('INSERT INTO `foo` (`fooid`,`data`,`time_added`) VALUES '
+','.join(
['(%s,%s,NOW())'%connection.literal(arg)
for arg in args]))
cursor.execute(sql)
Điều này trông thật kinh khủng và có thể khiến da của bạn thu thập dữ liệu, nhưng nếu bạn nhìn kỹ hơn (trong /usr/lib/pymodules/python2.6/MySQLdb/cursors.py) những gì MySQLdb đang làm trong cursors.executemany
, Tôi nghĩ rằng điều này giống như những gì hàm đó đang thực hiện, trừ đi sự trộn lẫn do regex cursors.insert_values
không phân tích cú pháp chính xác các dấu ngoặc đơn lồng nhau. (eek!)
Tôi vừa cài đặt ourql , một giải pháp thay thế cho MySQLdb và rất vui khi báo cáo rằng
sql='INSERT INTO `foo` (`fooid`,`data`,`time_added`) VALUES (?,?,NOW())'
cursor.executemany(sql,args)
hoạt động như mong đợi với ourql.