ডিবাগিং (প্রদর্শন করা) এসকিউএল কমান্ড এসকিউএলএলচেমির মাধ্যমে ডিবিতে প্রেরণ করা হয়েছে


90

আমার একটি ব্যক্তি নামক একটি ওআরএম ক্লাস রয়েছে, যা কোনও ব্যক্তির টেবিলের চারপাশে আবৃত থাকে:

ডিবি ইত্যাদির সাথে সংযোগ স্থাপনের পরে আমি বিবৃতিটি চালাচ্ছি:

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

ব্যক্তির টেবিলটিতে কোনও ডেটা থাকে না (যেমন এখনও), সুতরাং আমি যখন ভেরিয়েবলটি মুদ্রণ করি তখন আমি peopleএকটি খালি তালিকা পাই।

আমি আমার ওআরএম ক্লাসে উল্লিখিত টেবিলটির নামকরণ করেছি People, people_fooযা (যার অস্তিত্ব নেই)।

আমি তখন আবার স্ক্রিপ্ট চালাতে। আমি অবাক হয়েছিলাম যে অস্তিত্ব নেই এমন একটি টেবিলটি অ্যাক্সেস করার চেষ্টা করার সময় কোনও ব্যতিক্রম ছোঁড়া হয়নি।

আমার তাই নিম্নলিখিত 2 টি প্রশ্ন আছে:

  1. আমি কীভাবে এসকিউএলএলচেমি সেটআপ করব যাতে এটি স্ক্রিপ্টে ফিরে ডিবি ত্রুটিগুলি প্রচার করে?
  2. ডিবি ইঞ্জিনে যে এসকিউএল প্রেরণ করা হচ্ছে তা কীভাবে আমি দেখতে (অর্থাত মুদ্রণ) করব?

যদি এটি সহায়তা করে তবে আমি পোস্টগ্রিজ এসকিউএল ব্যবহার করছি।

[সম্পাদনা]

আমি একটি প্যাকেজ লিখছি। আমার __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)

[সম্পাদনা 2]

প্রচলিত মডিউল লগারটি সঠিকভাবে সেট আপ করে এবং আমি আমার অন্যান্য মডিউলগুলিতে লগার ব্যবহার করতে পারি যা সাধারণ আমদানি করে।

তবে dbfuncsমডিউলে, আমি নিম্নলিখিত ত্রুটি / সতর্কতা পাচ্ছি:

"স্ক্লালচেমি.েনজিন.বেজ.এজাইন। লগারের জন্য কোনও হ্যান্ডলার খুঁজে পাওয়া যায়নি


কোডের ইনডেনশনটি নষ্ট হয়ে গেছে, আমি এখানে কোনও common.setup_logger()কল দেখতে পাই না (এটি সঠিকভাবে লগিং কনফিগার করে ধরে নেওয়া হচ্ছে)। এছাড়াও, echo=Trueলগিং ব্যবহার করার সময় আপনার প্রয়োজন হবে না ।
ডেনিস ওটকিডাচ

@ এডিস: হ্যাঁ লগারটি সাধারণ মডিউলে সঠিকভাবে সেটআপ হয় - আমি অন্য মডিউলগুলিতে লগ ইন করতে সক্ষম। Dbfuncs.py মডিউলটির জন্য। আমি ত্রুটিটি পেয়েছি: "স্কালচেমি.ইঞ্জিন.বেজ.এজাইন
মরফিয়াস

4
মানে রুট এটির "না হ্যান্ডেলার এটির জন্য খুঁজে পাওয়া যাবে না", কোন হ্যান্ডেলার হয়েছে অর্থাত এটির নয় এখনো সঠিকভাবে কনফিগার করা। সম্ভবত আপনি কিছু নির্দিষ্ট (মূল নয়) লগারটি কেবলমাত্র কনফিগার করেছেন (এবং তাই আপনি এটি ব্যবহার করতে পারেন) বা এটি প্রথমবার ব্যবহারের পরে আপনি এটি কনফিগার করেছেন ।
ডেনিস ওটকিডাচ

উত্তর:


213

echoপ্যারামিটার ছাড়াও create_engine()আরও নমনীয় উপায় রয়েছে: loggingইঞ্জিনের বিবৃতি প্রতিধ্বনিত করতে কনফিগার করা:

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

আরও তথ্যের জন্য ডকুমেন্টেশনের লগিং বিভাগটি কনফিগার করা দেখুন ।


4
@ এডনিস: এটির পরিবর্তে অপফ কনসোলটি ফাইলে লগইন করার জন্য আমি যা করব। আমি ইতিমধ্যে আমার প্যাকেজটির প্রধান .py এ আমার লগিং ব্যবহার করছি (আমার সম্পাদিত কোডটি দেখুন) - আপনার প্রস্তাবিত পরিবর্তনগুলি করার পরে, এখন বার্তাগুলি আর কনসোলটিতে প্রদর্শিত হবে না (ভাল), তবে সেগুলি লগ ফাইলেও উপস্থিত হচ্ছে না (খারাপ) আপনি কীভাবে বার্তা ফাইল করতে লগ পাবেন তা পরিষ্কার করতে পারেন?
মর্ফিয়াস

4
সুন্দর মুদ্রণ যোগ করার কোনও উপায় আছে? আমার প্রশ্নগুলি ডিফল্টরূপে আউটপুট করা হয় তা একটি ছোট্ট বিপর্যয়।
আরআর-

সুতরাং এই ফাইলটি শেষ পর্যন্ত লগ ইন করা অসম্ভব? আমি ডক্সগুলিতে গভীরভাবে অনুসন্ধান করেছি এবং উপচে পড়েছি, তবে কেউ কেউ এই সমস্যাটির বিষয়ে চিন্তা করে না বলে মনে হয়, এমনকি যখন প্রশ্নটি উপরোক্তভাবে মরফিয়াসের মতো কেউ স্পষ্টভাবে জিজ্ঞাসা করেছিল। এখানে কি সুস্পষ্ট কিছু আছে?
রোমেন ভিনসেন্ট

4
@ রোমাইনভ্যানসেন্ট লগিং কনফিগার করে ফাইল সহ আপনি যেখানেই চাইবেন লগ করা তথ্য পরিচালনা করা সম্ভব।
ডেনিস ওটকিডাচ

82

echo=Trueইঞ্জিন ইনস্ট্যান্সটি তৈরি হয়ে যাওয়ার পরে আপনি সাধারণত এসকিউএল স্টেটমেন্টগুলি ডিবিতে প্রেরণ করা দেখতে পাচ্ছেন (সাধারণত create_engine()or বা ব্যবহার করে)engine_from_config() আপনার কোডটিতে কল কল )।

উদাহরণ স্বরূপ:

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

ডিফল্টরূপে, লগ করা বিবৃতিগুলি স্টডআউটে যায়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.