Python - вызов функции python из другого скрипта - PullRequest
0 голосов
/ 17 сентября 2018

Я пытаюсь вызвать соединение с БД из другого скрипта Python. Я получаю сообщение об ошибке NameError: name

'db_cur' 

не определено. Ниже приведен код, который я использую:

file1.py

import psycopg2
def db_login():
    global dwh_connection
    global dwh_cur
    try:
        dwh_connection = psycopg2.connect(db_details)
        db_cur = dwh_connection.cursor()
    except:
        print("Conn failed")
    print('Connection Success')

file2.py

from file1 import db_login

def rep1():
    db_cur.execute("""SQL statement""")
    dwh_connection.commit()
    dwh_connection.close()
    print('Task Completed')

Это выдает ошибку

NameError: name 'db_cur' is not defined

Может ли кто-нибудь помочь мне понять, где я ошибаюсь. Спасибо

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

В Python «глобальный» действительно означает «глобальный на уровне модуля», а не «глобальный», поэтому dwh_connection и dwh_cur не будут автоматически доступны в file2.

При этом, полагаясь на глобальные переменные, это плохая идея - вы db_login() функция должны вернуть соединение вместо установки глобального (или в дополнение к установке глобального уровня модуля, если вы хотите избежать открытие нескольких соединений).

Кроме того, вам вообще не следует создавать курсор здесь - курсоры не являются реентерабельными и должны создаваться заново каждый раз, когда вам нужен (создание курсора очень дешево).

И, наконец, ваш обработчик исключений в db_login() хуже, чем бесполезный, он просто вреден - вместо подробного сообщения об ошибке (и отслеживания), объясняющего как можно точнее, что пошло не так (так что у вас есть шанс отладить проблема), у вас просто совершенно бесполезное сообщение «ошибка соединения».

Короче говоря, "правильная" эквивалентная версия вашей функции:

def db_login():
    return psycopg2.connect(db_details)

Также обратите внимание, что в вашем модуле file2.py вы импортируете db_login, но никогда не вызываете его:

from file1 import db_login

def foo():
    db = db_login()
    cursor = db.cursor()
    try:
        # do something with the cursor
    finally:
       # make sure you close the connection
       db.close()
0 голосов
/ 17 сентября 2018

db_cur имеет локальную область видимости в db_login. Это означает, что к нему нельзя получить доступ снаружи db_login. Лучший способ сделать это - вернуть объект и использовать возвращенный объект в сценарии 2.

Например, file1.py:

import psycopg2

def db_login():
    global dwh_connection
    global dwh_cur
    try:
        dwh_connection = psycopg2.connect(db_details)
        db_cur = dwh_connection.cursor()
        return db_cur 
    except:
        print("Conn failed")
        return None
    print('Connection Success')

file2.py

from file1 import db_login

def rep1():
    db_cur = db_login()
    if db_cur is not None:
        db_cur.execute("""SQL statement""")
        dwh_connection.commit()
        dwh_connection.close()

    print('Task Completed')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...