Tam*_*mpa 4 python mysql mysql-python
我在python中使用mysqldb.
我需要为表格执行以下操作.
1) Lock
2) Read
3) Truncate the table
4) Unlock
Run Code Online (Sandbox Code Playgroud)
当我运行以下代码时,我得到以下错误.所以,我不确定如何锁定表格来读取它,然后截断表格.我需要确保没有其他连接读取数据.
asin_list = []
conn = MySQLdb.connect(host=parms['database']['operations']['host'],user=parms['database']['operations']['username'],passwd=parms['database']['operations']['password'],db=parms['database']['operations']['database'])
cursor = conn.cursor()
query = "LOCK TABLES asin_one_time_only READ"
cursor.execute(query)
print 'fu1'
query = """select asin FROM asin_one_time_only"""
cursor.execute(query)
rows = cursor.fetchall()
for row in rows:
asin_list.append(row[0])
print asin_list
print 'fu2'
query = "UNLOCK TABLES;"
cursor.execute(query)
conn.commit()
print 'fu3'
query = "LOCK TABLES asin_one_time_only WRITE"
cursor.execute(query)
query = """truncate table amz_one_time_only"""
cursor.execute(query)
conn.commit()
print 'fu3'
query = "UNLOCK TABLES;"
cursor.execute(query)
conn.commit()
cursor.close()
conn.close()
Traceback (most recent call last):
File "/home/ubuntu/workspace/Amazon-Products-Crawler-1/threaded_crawl.py", line 1086, in <module>
onetime = getOneTimeOnlyAsins(parms)
File "/home/ubuntu/workspace/Amazon-Products-Crawler-1/threaded_crawl.py", line 109, in getOneTimeOnlyAsins
cursor.execute(query)
File "/usr/lib/pymodules/python2.7/MySQLdb/cursors.py", line 166, in execute
self.errorhandler(self, exc, value)
File "/usr/lib/pymodules/python2.7/MySQLdb/connections.py", line 35, in defaulterrorhandler
raise errorclass, errorvalue
_mysql_exceptions.OperationalError: (1192, "Can't execute the given command because you have active locked tables or an active transaction")
Run Code Online (Sandbox Code Playgroud)
您不能截断为写入而锁定的表.这是因为"truncate"意味着"销毁表,并重新创建具有相同模式的新表".
但是,您可以清空表格.而不是TRUNCATE TABLE asin_one_time_only使用DELETE FROM asin_one_time_only.请注意,这不会重置自动增量编号.如果您想重置它,请使用ALTER TABLE asin_one_time_only auto_increment=1
我建议这样做:
LOCK TABLES asin_one_time_only READ;
SELECT asin FROM asin_one_time_only;
-- minimize the possibility of someone writing to the table in-between
-- an "UNLOCK TABLES" and a "LOCK TABLES" by just issuing a new LOCK TABLES
-- I am not 100% sure that MySQL will do this atomically, so there is a
-- possibility that you may delete a row that was not read.
-- If this is unacceptable, then use a "LOCK TABLES asin_one_time_only WRITE"
-- from the very beginning.
LOCK TABLES asin_one_time_only WRITE;
DELETE FROM asin_one_time_only;
ALTER TABLE asin_one_time_only auto_increment=1;
UNLOCK TABLES;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14213 次 |
| 最近记录: |