मैं एक एसक्लाइट डीबी (सरल सीआरयूडी ऑपरेशंस) को लपेटने के लिए एक छोटा जीयूआई एप्लीकेशन डिज़ाइन कर रहा हूं। मैं (एक /models
फ़ोल्डर में m_person
, m_card.py
, m_loan.py
, सभी) तीन SQLAlchemy मॉडल बनाया है और पहले से हर एक के शीर्ष पर निम्न कोड था:क्या मॉड्यूल आयात करते समय कोड निष्पादित करना ठीक है?
from sqlalchemy import Table, Column, create_engine
from sqlalchemy import Integer, ForeignKey, String, Unicode
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import backref, relation
engine = create_engine("sqlite:///devdata.db", echo=True)
declarative_base = declarative_base(engine)
metadata = declarative_base.metadata
इसमें कुछ समय गलत (सूखी) महसूस किया तो यह सुझाव दिया गया था कि मैं इन सभी चीजों को मॉड्यूल स्तर पर ले जाऊं (models/__init__.py
में)।
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy import Table, Column, Boolean, Unicode
from settings import setup
engine = create_engine('sqlite:///' + setup.get_db_path(), echo=False)
declarative_base = declarative_base(engine)
metadata = declarative_base.metadata
session = sessionmaker()
session = session()
तो जैसे declarative_base
आयात ..और:
from sqlalchemy import Table, Column, Unicode
from models import declarative_base
class Person(declarative_base):
"""
Person model
"""
__tablename__ = "people"
id = Column(Unicode(50), primary_key=True)
fname = Column(Unicode(50))
sname = Column(Unicode(50))
हालांकि मैं प्रतिक्रिया का एक बहुत है कि इस तरह मॉड्यूल आयात के रूप में क्रियान्वित कोड बुरा है लिया है? मैं ऐसा करने के सही तरीके से एक निश्चित उत्तर की तलाश में हूं क्योंकि ऐसा लगता है कि कोड पुनरावृत्ति को हटाने की कोशिश करके मैंने कुछ अन्य बुरे प्रथाओं को पेश किया है। कोई प्रतिक्रिया वास्तव में उपयोगी होगी।
(नीचे get_db_path()
के रूप में यह ऊपर models/__init__.py
कोड में कहा जाता है संपूर्णता के लिए settings/setup.py
से विधि है।)
def get_db_path():
import sys
from os import makedirs
from os.path import join, dirname, exists
from constants import DB_FILE, DB_FOLDER
if len(sys.argv) > 1:
db_path = sys.argv[1]
else:
#Check if application is running from exe or .py and adjust db path accordingly
if getattr(sys, 'frozen', False):
application_path = dirname(sys.executable)
db_path = join(application_path, DB_FOLDER, DB_FILE)
elif __file__:
application_path = dirname(__file__)
db_path = join(application_path, '..', DB_FOLDER, DB_FILE)
#Check db path exists and create it if not
def ensure_directory(db_path):
dir = dirname(db_path)
if not exists(dir):
makedirs(dir)
ensure_directory(db_path)
return db_path
मेरा 2 सी, जबकि आम तौर पर '__init __। Py' में यह कोड कोड डालना ठीक है (यह वही है!), डेटाबेस URL सेट करने के लिए अब तक मुझे गलत लगता है। यह परीक्षण कठिन कर सकता है। ऐसा लगता है कि आपको क्या करना चाहिए मॉड्यूल के लिए 'init()' फ़ंक्शन है। – cha0site
मुझे लगता है कि यहां समस्या यह है कि आधार वर्ग 'declarative_base' गतिशील रूप से बनाया गया है और ऐसा लगता है कि डेटाबेस इंजन पर निर्भर करता है। मुझे नहीं पता कि sqlalchemy कैसे काम करता है, लेकिन डीबी कनेक्शन बनाने से पहले मॉडल कक्षाओं को परिभाषित करना संभव नहीं है ?? मैं शायद ही उस पर विश्वास कर सकता हूं। –
@ निकलासबी। 'Declarative_base'" मेटाडाटा "पर निर्भर करता है जो मूल रूप से कोर स्क्लेक्लेमी इंजन है। यह आवश्यक रूप से डेटाबेस के साथ कोई संबंध नहीं है, हालांकि आप इसे सादगी के लिए एक चुन सकते हैं। – wberry