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()
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 insteadThe methods on your
Main
class look like they belong in theAddress
class.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:
In Java you'd do
this.session = ...
; in Python that'sself.session = ...
.use self.session
to save variables in session