डीबगिंग (प्रदर्शित) SQL कमांड SQLAlchemy द्वारा db को भेजा गया


89

मेरे पास एक ORM वर्ग है जिसे पर्सन कहा जाता है, जो एक व्यक्ति तालिका के चारों ओर घूमता है:

Db आदि से संबंध स्थापित करने के बाद, मैं कथन चलाता हूं:

people = session.query(Person).all()

व्यक्ति तालिका में कोई डेटा नहीं है (अभी तक), इसलिए जब मैं चर प्रिंट करता हूं, तो peopleमुझे एक खाली सूची मिलती है।

मैंने अपने ORM वर्ग में People, people_foo(जो मौजूद नहीं है) को संदर्भित तालिका का नाम बदल दिया ।

मैं फिर स्क्रिप्ट चलाता हूं। मुझे आश्चर्य हुआ कि जब कोई तालिका मौजूद नहीं होती है, तो पहुंचने के लिए कोई अपवाद नहीं रखा गया था।

इसलिए मेरे पास निम्नलिखित 2 प्रश्न हैं:

  1. मैं SQLAlchemy को कैसे सेटअप कर सकता हूं ताकि यह db त्रुटियों को स्क्रिप्ट में वापस प्रसारित करे?
  2. मैं db इंजन को भेजे जा रहे SQL को (यानी प्रिंट) कैसे देख सकता हूं?

यदि यह मदद करता है, तो मैं PostgreSQL का उपयोग कर रहा हूं।

[संपादित करें]

मैं एक पैकेज लिख रहा हूं। मेरी __main__.pyस्क्रिप्ट में, मेरे पास निम्न कोड है (यहाँ छोटा है):

### __main__.py
import common # imports logging and defines logging setup funcs etc

logger = logging.getLogger(__name__)


def main():    
    parser = OptionParser(usage="%prog [options] <commands>",
                          version="%prog 1.0")

    commands = OptionGroup(parser, "commands")

    parser.add_option(
        "-l",
        "--logfile",
        dest="logfile",
        metavar="FILE",
        help="log to FILE. if not set, no logging will be done"
    )

    parser.add_option(
        "--level",
        dest="loglevel",
        metavar="LOG LEVEL",
        help="Debug level. if not set, level will default to low"
    )

    # Set defaults if not specified
    if not options.loglevel:
        loglevel = 1
    else:
        loglevel = options.loglevel

    if not options.logfile:
        logfilename = 'datafeed.log'
    else:
        logfilename = options.logfile

    common.setup_logger(False, logfilename, loglevel) 

       # and so on ...



        #### dbfuncs.py


import logging

    # not sure how to 'bind' to the logger in __main__.py
    logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)

    engine = create_engine('postgres://postgres:pwd@localhost:port/dbname', echo=True)

[EDIT2]

सामान्य मॉड्यूल सही तरीके से लकड़हारा सेट करता है, और मैं अपने अन्य मॉड्यूल में लकड़हारा का उपयोग कर सकता हूं जो आम आयात करता है।

हालांकि dbfuncsमॉड्यूल में, मुझे निम्नलिखित त्रुटि / चेतावनी मिल रही है:

लकड़हारा "sqlalchemy.engine.base.Engine" के लिए कोई हैंडलर नहीं मिला


कोड का संकेत टूट गया है, मुझे कोई common.setup_logger()कॉल नहीं है (यह मानते हुए कि यह लॉगिंग को ठीक से कॉन्फ़िगर करना है)। साथ ही, echo=Trueलॉगिंग का उपयोग करते समय आपको इसकी आवश्यकता नहीं है ।
डेनिस ओटकिडैच

@ हेडिस: हां लकड़हारा सामान्य मॉड्यूल में सही ढंग से सेटअप है - मैं अन्य मॉड्यूल में लॉग इन करने में सक्षम हूं। Dbfuncs.py मॉड्यूल के लिए। मुझे त्रुटि मिलती है: लकड़हारा के लिए कोई हैंडलर नहीं मिल सका "sqlalchemy.engine.base.Engine
morpheous

1
"कोई हैंडलर लकड़हारे के लिए नहीं पाया जा सकता है" इसका मतलब है कि रूट लॉगर में कोई हैंडलर नहीं है, यानी लकड़हारा अभी तक ठीक से कॉन्फ़िगर नहीं किया गया है। संभवतः आपने कुछ विशिष्ट (रूट नहीं) लकड़हारे को केवल (और इसलिए आप इसका उपयोग कर सकते हैं) कॉन्फ़िगर किया है या आपने इसे पहली बार उपयोग करने के बाद इसे कॉन्फ़िगर किया है।
डेनिस ओटकिडैच

जवाबों:


210

वहाँ के echoपैरामीटर के अलावा create_engine()एक और अधिक लचीला तरीका है: loggingइको इंजन स्टेटमेंट को कॉन्फ़िगर करना:

import logging
logging.basicConfig()
logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)

अधिक जानकारी के लिए दस्तावेज़ का लॉगिंग अनुभाग कॉन्फ़िगर करना देखें ।


1
@ डेनिस: यह वह है जो मैं बल्कि opf कंसोल के बजाय फाइल करने के लिए लॉग इन करना चाहूंगा। मैं पहले से ही अपने पैकेज के मुख्य .py में लॉगिंग का उपयोग कर रहा हूं (मेरा संपादित कोड देखें) - आपके द्वारा अनुशंसित परिवर्तनों को करने के बाद, अब संदेश कंसोल (अच्छे) पर दिखाई नहीं दे रहे हैं, लेकिन वे लॉग फ़ाइल में भी दिखाई नहीं दे रहे हैं (खराब)। क्या आप स्पष्ट कर सकते हैं कि फ़ाइल में लॉग किए गए संदेशों को कैसे प्राप्त करें?
14

3
क्या सुंदर मुद्रण जोड़ने का कोई तरीका है? जिस तरह से मेरे प्रश्नों को डिफ़ॉल्ट रूप से आउटपुट किया जाता है वह एक छोटी आपदा है।
rr-

तो क्या अंत में फ़ाइल में लॉग इन करना असंभव है? मैंने डॉक्स और स्टैक ओवरफ्लो में गहराई से खोज की है, लेकिन किसी को भी इस समस्या के बारे में परवाह नहीं है, यहां तक ​​कि जब सवाल स्पष्ट रूप से किसी से पूछा जाता है जैसे कि मॉर्फियस ने ऊपर किया था। क्या यहाँ कुछ स्पष्ट है?
रोमेन विंसेंट

1
@RomainVincent लॉगिंग को कॉन्फ़िगर करके फ़ाइल सहित, जहाँ भी आप चाहते हैं, लॉग जानकारी को निर्देशित करना संभव है।
डेनिस ओटकिडैच

81

echo=Trueजब इंजन उदाहरण बनाया जाता है (आमतौर पर आपके कोड में create_engine()या engine_from_config()कॉल का उपयोग करके ) आप पास करके DB को भेजे जा रहे SQL स्टेटमेंट देख सकते हैं ।

उदाहरण के लिए:

engine = sqlalchemy.create_engine('postgres://foo/bar', echo=True)

डिफ़ॉल्ट रूप से, लॉग किए गए कथन stdout में जाते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.