2015-07-28 2 views
1

Я очень новичок в sqlalchemy и пытаюсь понять, как сделать вещи чище и подключаться.Доступ к тому же db.session через разные модули в sqlalchemy

Я создал файл/base base.py, где я создал сеанс и установил все мои объекты в таблицах (наряду с отношениями и т. Д.). Я хочу создать еще один модуль, в котором я управляю операциями CRUD для сущностей (таблиц) в base.py. Этот файл называется object.py и имеет класс BaseAPI (объект) и имеет разные функции «создавать» «читать» «обновление» и «удалить». Я хочу убедиться, что я подключаюсь к моей таблице (base.py) в object.py и работает с объектом User. В этом случае объектом (таблицей) является «Пользователи».

Это то, что я имею в API object.py документ:

#!/usr/bin/env python 

from sqlalchemy import create_engine 
from sqlalchemy.orm import relationship, backref, sessionmaker 
from datetime import datetime, timedelta 
import notssdb.model 
from base import User #importing from the module base.py -- doesn't work 

engine = create_engine('sqlite:///./notssdb.db', echo=True) #in-memory sql engine 

# create a Session 
Session = sessionmaker(bind=engine) 


class BaseAPI(object): 
# DBSession = scoped_session(sessionmaker(engine)) 
# users = DBSession.query(User).all() 

    def __init__ (self): 
     session = Session() 


# CREATE USER 

    def create_user(self, username, password, fullname): 
     new_user = User(username, password, fullname) 
     self.session.commit(new_user) 
     print(username, password, fullname) 

Могу ли я импортировать слишком много вещей? Нужно ли мне импортировать все инструменты sqlalchemy? Является ли мой init конструктором под классом BaseAPI необходимо создать экземпляр сеанса БД?

ответ

1

1. Я импортирую слишком много вещей? Нужно ли мне импортировать все инструменты sqlalchemy?

У Sqlalchemy нет собственного стиля кодирования, вы должны следовать Python coding style. Если вы не используете какой-либо модуль, его не нужно импортировать.

Я не вижу, что это было использовано from sqlalchemy.orm import relationship, backref, и это должно использоваться при определении models, поэтому вам не нужно импортировать эти модули.

2. Создает ли мой конструктор init под классом BaseAPI создание экземпляра базы данных ?

Там нет жесткого правила, что вы имеете начать session в вашем BaseAPI, вы можете даже написать программу, как это ..

#!/usr/bin/env python 

from sqlalchemy import create_engine 
from sqlalchemy.orm import relationship, backref, sessionmaker 
from datetime import datetime, timedelta 
import notssdb.model 
from base import User #importing from the module base.py -- doesn't work 

engine = create_engine('sqlite:///./notssdb.db', echo=True) #in-memory sql engine 

# create a Session 
Session = sessionmaker(bind=engine) 
session = Session() 


class BaseAPI(object): 

# CREATE USER 

    def create_user(self, username, password, fullname): 
     new_user = User(username, password, fullname) 
     session.commit(new_user) 
     print(username, password, fullname) 

Но это не хорошая практика, чтобы клуб вашего connection поколения части с user manager Я хотел бы предложить вам следовать этому пути ..

Примечание: Это просто пример кода, и я не выполнить это, вы просто должны следовать этому, чтобы structure код.

Сначала создайте отдельный модуль для управления подключением, может быть как connection_manager.py с нижеследующим содержимым.

from sqlalchemy import create_engine 
from sqlalchemy.orm import sessionmaker 

engine = create_engine('sqlite:///./notssdb.db', echo=True) 

# create a Session 
Session = sessionmaker(bind=engine) 

class SessionManager(object): 
    def __init__(self): 
     self.session = Session() 

И создать user_manger.py и импортировать SessionManager здесь.

from base import User # this is your User model 
from connection_manager import SessionManager 

class UserManager(SessionManager): 

    def create_user(self, username, password, fullname): 
     new_user = User(username, password, fullname) 
     self.session.commit(new_user) 
     print(username, password, fullname) 

    def delete_user(self, *args): 
     pass # your code 

Таким образом, вы можете сделать свой код более чистым.