Python 我是否需要刷新sqlalchemy连接对象才能将数据插入到新创建的表中?

Python 我是否需要刷新sqlalchemy连接对象才能将数据插入到新创建的表中?,python,sqlalchemy,pymysql,Python,Sqlalchemy,Pymysql,我是炼金术的初学者 我在_core.py中的连接函数 在我的代码中,如果我创建的特定主机不存在该表。如下图所示: 服务器_status.py 如果我直接调用set_status,它可以正常工作,但是get_status会抛出错误,说明: pymysql.err.InternalError:1412,'表定义已更改, 请重试事务处理' 您不应该使用lru缓存来存储连接,而应该使用引擎的内置连接池。然后,每次需要与数据库通话时,请求引擎连接,并在完成连接后关闭连接。默认情况下,引擎将有一个大小为5的

我是炼金术的初学者

我在_core.py中的连接函数

在我的代码中,如果我创建的特定主机不存在该表。如下图所示:

服务器_status.py

如果我直接调用set_status,它可以正常工作,但是get_status会抛出错误,说明:

pymysql.err.InternalError:1412,'表定义已更改, 请重试事务处理'


您不应该使用lru缓存来存储连接,而应该使用引擎的内置连接池。然后,每次需要与数据库通话时,请求引擎连接,并在完成连接后关闭连接。默认情况下,引擎将有一个大小为5的池

从sqlalchemy导入创建引擎 def get_enginedb=家庭局域网: qs='mysql+pymysql://user:pwd@localhost/{db}'.formatdb=db 引擎=创建引擎 回程发动机 类HostStatusManagerobject: 保存记录=10天 此类包含管理主机状态的方法 为监督或监控目的在数据库中注册。 定义初始化自身,ip地址: 超级主机状态管理器,self.\u init__ self.\u ip=ip\u地址 引擎,连接=_core.get_引擎 自身发动机=发动机 self.\u host\u table=无 self.\u host\u table\u name=None 如果不存在self.host\u status\u table\u: self.\u host\u table=self.\u create\u table def get_statusself: 获取主机的最新状态(联机或脱机)。 columns=self.\u host\u table.columns printCols:.formatcolumns 选择\字段=getattrcolumns,状态 query=db.select [选择\u字段] .订购 数据库描述 getattrcolumns,id .limit1 _log.debugquery 连接=自。_engine.connect 尝试: ResultProxy=connection.executequery ResultSet=ResultProxy.fetchall 如果结果集: 返回结果集[0][0] _log.warning在{0}中找不到现有状态..格式 自.\u主机\u表 最后: 连接。关闭 def set_statusself,数据: query=db.insertself.\u host\u table.values**data 连接=自。_engine.connect 尝试: 结果=connection.executequery 最后: 连接。关闭
我应该在创建新表后立即重新调用connection=self.\u engine.get\u connection而不是try吗?PS:我尝试了:connection=self.\u engine.get\u connection并得到此错误>AttributeError:“engine”对象没有属性“get\u connection”对不起,engine.connect。我会解决的。谢谢你已经用过了,还有try block不能没有except。你说默认池大小是5,这是否意味着现有连接只有5个事务,除非关闭?
from sqlalchemy import create_engine
from methodtools import lru_cache


@lru_cache(maxsize=16)
def get_engine(db="homelan"):
    qs = 'mysql+pymysql://user:pwd@localhost/{db}'.format(db=db)
    engine = create_engine(qs)
    connection = engine.connect()
    return engine, connection
class HostStatusManager(object):

    keep_record = 10 # days

    """This class contains methods to manage the status of the host
    registered in database for supervision or monitoring purpose.
    """

    def __init__(self, ip_address):
        super(HostStatusManager, self).__init__()
        self._ip = ip_address
        engine, connection = _core.get_engine()
        self._engine = engine
        self._connection = connection
        self._host_table = None
        self._host_table_name = None
        if not self.host_status_table_exists():
            self._host_table = self._create_table()



    def get_status(self):
        """Gets the latest status of the host whether online or offline.
        """
        columns = self._host_table.columns
        print("Cols: ".format(columns))
        select_field = getattr(columns, "status")
        query = db.select(
                [select_field]
            ).order_by(
                db.desc(
                    getattr(columns, "id")
                    )
                ).limit(1)
        _log.debug(query)
        ResultProxy = self._connection.execute(query)
        ResultSet = ResultProxy.fetchall()
        if ResultSet:
            return ResultSet[0][0]
        _log.warning("No existing status found from {0}.".format(
            self._host_table
            )
        )

    def set_status(self, data):
        query = db.insert(self._host_table).values(**data)
        results = self._connection.execute(query)