Python: define object variable without initializat

2019-09-22 13:46发布

I am trying to rewrite my code from one big function to oop.

If I have this, it crash on session.add(a1) # Unresolved reference:

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import *
from sqlalchemy.orm import *

Base = declarative_base()

class Address(Base):
    __tablename__ = 'address'
    id = Column(Integer, primary_key=True)
    street = Column(String, nullable=False)
    city = Column(String, nullable=False)
    user = relationship('User', back_populates="address")

class Main():
    def __init__(self):
        engine = create_engine('mysql://test:test@localhost:3306/test', echo=False)
        Session = sessionmaker(bind=engine)
        session = Session()

    def insert(self):
        #   INSERT
        a1 = Address()
        a1.street = "Str 123"
        a1.city = "City WTF"

        session.add(a1) # Unresolved reference
        session.commit()

if __name__ == '__main__':
    Main().run()

I understand it. session is local object in constructor (__init__).

But how can I put object "directly to class"? In Java I do something like:

public class Main {
    Engine engine;
    Session session;
    public Main() {}
        engine = create_engine('mysql://test:test@localhost:3306/test', echo=False)
        session = sessionmaker(bind=engine)
    }
    private insert() {
        //...
        session.commit();
    }
}

How can I do it in python? Sorry for stupid question, I am python newbie.

--------------------- EDIT:

class Main():
    engine = None # What I write here? How declare uninitialized object?
    session = None # What I write here?
    def __init__(self):
        engine = create_engine('mysql://test:test@localhost:3306/test', echo=False)
        Session = sessionmaker(bind=engine)
        session = Session()

    def insert(self):
        #   INSERT
        a1 = Address()
        a1.street = "Str 123"
        a1.city = "City WTF"
        self.session.add(a1) # Is possible to call session without "self"?
        self.session.commit()

4条回答
Emotional °昔
2楼-- · 2019-09-22 14:04

You are initializing local variable session in the __init__ method and calling for it in a method this variable is unknown to.

use self.varialbe in both cases instead

查看更多
贼婆χ
3楼-- · 2019-09-22 14:08

The methods on your Main class look like they belong in the Address class.

engine = create_engine('mysql://test:test@localhost:3306/test', echo=False)
session = sessionmaker(bind=engine)

class Address(Base):
    __tablename__ = 'address'
    id = Column(Integer, primary_key=True)
    street = Column(String, nullable=False)
    city = Column(String, nullable=False)
    # you are missing some fields you'll need eventually
    state = Column(String, nullable=False)
    zip_code = Column(String, nullable=False)  # this can be an int if you don't have to worry about Canadian zips which have letters in them
    user = relationship('User', back_populates="address")

    def __init__(self, street, city, state, zip_code, user):
        self.street = street
        self.city = city
        self.state = state
        self.zip_code = zip_code
        self.user = user

    def insert(self, session):
        #   INSERT
        session.add(self)
        session.commit()

You shouldn't create the session as part of a class because then you will be creating a new one every time you instantiate a class. Keep the session in the global space and pass it in to your methods/functions that need it as a parameter (don't use global).

Now with everything in right place you can use it like this:

from models import session, Address
addr = Address('123 Test St.', 'Sometown', 'NY', '12345', some_user)
addr.insert(session)
查看更多
可以哭但决不认输i
4楼-- · 2019-09-22 14:10

In Java you'd do this.session = ...; in Python that's self.session = ....

查看更多
forever°为你锁心
5楼-- · 2019-09-22 14:16

use self.session
to save variables in session

查看更多
登录 后发表回答