sqlalchemy + python-daemon


]# /home/python2.7/bin/pip install SQLAlchemy

]# /home/python2.7/bin/pip install mysql-python

]# mkdir /home/package_manager

]# cd /home/package_manager

]# mkdir bin lib log run

]# cd bin

]# vi package_manager.py


#!/home/python2.7/bin/python

# -*- coding: UTF-8 -*-


import sys

import time

from daemon.runner import DaemonRunner

sys.path.append("/home/package_manager/lib")


class App(object):

    def __init__(self):

        self.stdin_path = "/dev/null"

        self.stdout_path = "/dev/tty"

        self.stderr_path = "/dev/tty"

        self.pidfile_timeout = 0

        self.pidfile_path = "/home/package_manager/run/app.pid"


    def run(self):

        from database import session

        from models import APMDistributionQueue

        while 1:

            tasks = session.query(APMDistributionQueue).all()

            for task in tasks:

                print task.server_info.hostn


            time.sleep(10)


def main():

    DaemonRunner(App()).do_action()


if __name__ == "__main__":

    main() 


]# cd lib

]# vi database.py


 # -*- coding: UTF-8 -*-

from sqlalchemy import create_engine

from sqlalchemy.orm import scoped_session, sessionmaker

from sqlalchemy.ext.declarative import declarative_base


engine = create_engine('mysql+mysqldb://아이디:비밀번호@localhost/manager_new', convert_unicode=True)

Base = declarative_base()

session = scoped_session(sessionmaker(autocommit=False, autoflush=False, bind=engine))


]# vi models.py


# -*- coding: UTF-8 -*-

from sqlalchemy.sql import func

from sqlalchemy import ForeignKey, Column, Integer, String, DateTime, Table

from sqlalchemy.orm import relationship, backref

from database import Base, engine


class ServerInfo(Base):

       __table__ = Table('info', Base.metadata, autoload=True, autoload_with=engine)


class APMPackage(Base):

    __tablename__ = 'apm_package'

    id = Column(Integer, primary_key=True)

    name = Column(String(100), unique=True)

    packaging_file = Column(String(200))

    unpackaging_path = Column(String(200))

    queue = relationship("APMDistributionQueue", backref=backref('package'), cascade='all, delete, delete-orphan')


    def __init__(self, name, file, path):

        self.name = name

        self.packaging_file = file

        self.unpackaging_path = path


    def __repr__(self):

        return "%s %s %s %s" % (self.id, self.name, self.packaging_file, self.unpackaging_path)


class APMDistributionQueue(Base):

    __tablename__ = 'apm_distribution_queue'

    id = Column(Integer, primary_key=True)

    mode = Column(String(20), nullable=False)

    server_id = Column(Integer, ForeignKey(ServerInfo.idx), nullable=False)

    package_id = Column(Integer, ForeignKey(APMPackage.id), nullable=False)

    status = Column(Integer, default=1, nullable=False)

    reg_date = Column(DateTime(timezone=True), default=func.now(), nullable=False)

    server_info = relationship("ServerInfo", backref=backref('queue'))


    def __init__(self, mode, sid, pid):

        self.mode = mode

        self.server_id = sid

        self.package_id = pid


    def __repr__(self):

        return "%s %s %s %s" % (self.id, self.mode, self.server_id, self.package_id) 


]# cd ../bin

]# package_manager.py start


프로세스가 fork 되면서 sqlalchemy 의 connection pool과의 연결이 끊기는 문제가 발생해서 한참을 고생했다.

해결방법은 run 메소드 안에서 database.py 를 import 하거나 engine 생성시에 pool_recycle 값을 0으로 설정하면 된다.


새로 만든 테이블과 기존에 있던 테이블을 같이 사용하기 위해 declarative_base, automap_base 중 어떤 맵핑클래스를 

사용하는지에따라 구현하는부분이 달라지는데 테스트코드를 만들어봐야 이해할듯하다.


http://programtalk.com/python-examples/daemon.pidfile.PIDLockFile/

 

 


'Python' 카테고리의 다른 글

pidlockfile.py for windows  (0) 2016.12.19
cygwin + ssh + rsync  (0) 2016.12.10
remove ^M(Carriage Return)  (0) 2016.11.30
pexpect.pxssh  (0) 2016.11.24
PEP8  (0) 2016.11.24

http://pexpect.readthedocs.io/en/stable/api/pxssh.html

'Python' 카테고리의 다른 글

pidlockfile.py for windows  (0) 2016.12.19
cygwin + ssh + rsync  (0) 2016.12.10
remove ^M(Carriage Return)  (0) 2016.11.30
sqlalchemy  (0) 2016.11.28
PEP8  (0) 2016.11.24

https://spoqa.github.io/2012/08/03/about-python-coding-convention.html


함수의 시작은 아래와 같이 대응하도록

– get/set

– add/remove

– create/destroy

– start/stop

– insert/delete

– increment/decrement

– old/new

– begin/end

– first/last

– up/down

– min/max

– next/previous

– open/close

– show/hide

– suspend/resume

– parent/child

'Python' 카테고리의 다른 글

pidlockfile.py for windows  (0) 2016.12.19
cygwin + ssh + rsync  (0) 2016.12.10
remove ^M(Carriage Return)  (0) 2016.11.30
sqlalchemy  (0) 2016.11.28
pexpect.pxssh  (0) 2016.11.24

+ Recent posts