Как импортировать вспомогательные функции, основанные на объекте курсора psycopg2? - PullRequest
0 голосов
/ 01 апреля 2019

Я создал несколько вспомогательных функций для основных действий Postgres, таких как создание соединения, создание курсора, создание таблицы, создание столбцов и так далее. Я сохранил функции в отдельном файле .py и добавил к пути. Я могу импортировать файл и видеть их при вызове dir(), но когда я пытаюсь вызвать функцию, которая зависит от объекта psycopg2.cursor(), он возвращает ошибку имени.

Я пытался превратить его в класс для доступа к объектам таким образом, но безуспешно. Я также попытался вызвать функцию cur в файле my_psycop.py.

#This is from the helper function file

import psycopg2

def connect_and_make_cursor(host, dbname, user, pw):
    try:
        conn = psycopg2.connect(f"host={host}, dbname={dbname} user = {user} password = {pw}")
        conn.set_session(autocommit = True)
        cur = conn.cursor()
    except psycopg2.Error as e:
        print(e)
    return cur


#this is from the file in which I am attempted to import the functions

import my_psycop
from password import password
#psycopg2 = my_psycop.psycopg2

dir(my_psycop)
['__builtins__',
 '__cached__',
 '__doc__',
 '__file__',
 '__loader__',
 '__name__',
 '__package__',
 '__spec__',
 'close_connection',
 'connect_and_make_cursor',
 'create_database',
 'create_table',
 'insert_columns',
 'insert_rows',
  'psycopg2']

 cur = my_psycop.connect_and_make_cursor("127.0.0.1", 'postgres', 'postgres', password )

my_psycop.create_database('new_db')

Ниже приведена ошибка трассировки:

NameError Traceback (most recent call last)
<ipython-input-11-5eb39fff83a2> in <module>()
----> 1 my_psycop.create_database('new_db')

c:\python36\lib\site-packages\my_psycop.py in create_database(db_name)
     12 def create_database(db_name):
     13     try:
---> 14         cur.execute(f"CREATE DATABASE {db_name}")
     15     except psycopg2.Error as e:
     16         print(e)

NameError: name 'cur' is not defined

Я никогда не использовал пользовательские функции таким образом, чтобы полагаться на отдельную библиотеку и понимаю, что это какая-то проблема с областями видимости, но я просто не могу понять это. Было бы замечательно, чтобы в будущем я не использовал эти функции в каждом отдельном файле, который я создаю. Заранее спасибо!

...