我使用的是SQLalchemy核心(不是会话)。我有一个DB类,看起来像这样:
class DB(object):
db_string = "mysql://%s:%s@%s/%s" % (db_username, db_password, db_host, db_name)
db_engine = create_engine(db_string, encoding="UTF-8", echo=False)
db_conn = db_engine.connect()
db_meta = MetaData()
table1 = Table("table1", db_meta, autoload=True, autoload_with=db_engine)
def get_data(self, time_limit):
stmt = select([self.table1]).where(self.table1.c.last_check < time_limit)
return self.db_conn.execute(alexa_domains)
我在加载时实例化这个类并传递实例引用。现在,主程序基本上在循环中轮询DB以查看time_limit是否足够小以执行更多代码。
while 1:
result = db_instance.get_data()
check_if_result_has_data_smaller_than_time_limit(result) # THIS always returns False
time.sleep(1)
问题在于,如果我手动更改数据库中的数据(last_check字段),或者另一个客户端进行更改,则此db_instance显然永远不会看到新数据,结果的大小将始终为0。我可以防止这种行为并确保在下一次迭代中它会看到应该返回的新行吗?
答案 0 :(得分:0)
问题是我重复使用相同的连接。这是一个非常简单的修复:
class DB(object):
db_string = "mysql://%s:%s@%s/%s" % (db_username, db_password, db_host, db_name)
db_engine = create_engine(db_string, encoding="UTF-8", echo=False)
table1 = Table("table1", MetaData(), autoload=True, autoload_with=db_engine)
def connect():
return self.db_engine.connect()
def get_data(self, time_limit):
connection = self.connect()
stmt = select([self.table1]).where(self.table1.c.last_check < time_limit)
return connection.execute(alexa_domains)
答案 1 :(得分:0)
正确的方法是强制选择自动提交,而不是强制建立新连接。
def get_data(self, time_limit):
stmt = select([self.table1]).execution_options(autocommit=True).where(self.table1.c.last_check < time_limit)
return connection.execute(alexa_domains)
见。 http://docs.sqlalchemy.org/en/latest/core/connections.html#understanding-autocommit