Задать вопрос
Dmustache
@Dmustache
Python, Cpp, SQL

Как удержать подключение к sql серверу с помощью python pyodbc?

Я делаю приложение на python(tkinter, pyodbc), и я хотел бы узнать, можно ли удержать подключение к sql-серверу для того чтобы не подключаться к серверу много раз?
import pandas
import pyodbc
import getpass

data = pandas.read_csv(f'C:\\Users\\{getpass.getuser()}}\\Documents\\InClass\\table.csv', sep=';', encoding='utf-8')
df = pandas.DataFrame(data, columns=['group_id','group_description','group_size'])

connection_string = (
    'Driver={SQL Server};'
    'Server=User;'
    'Database=ServerName;'
    'Trusted_Connection = yes;'
)

conn = pyodbc.connect(connection_string)

cursor = conn.cursor()

for row in df.itertuples():
    cursor.execute('''
                INSERT INTO InClassServer.dbo.groups (group_id, group_description, group_size)
                VALUES (?,?,?)
                ''',
                row.group_id,
                row.group_description,
                row.group_size
                )
conn.commit()
  • Вопрос задан
  • 278 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
@o5a
Во-первых, можно просто не закрывать соединение. Или использовать ту же самую глобальную переменную-соединение, или для удобства создать класс, обеспечивающий работу с базой, например так:
# пример был для sqlite, но принцип одинаков
class DataBase():
    def __init__(self, database_name):
        self.conn = sqlite3.connect(database_name)
        self.cursor = self.conn.cursor()

    def commit(self):
        self.conn.commit()

    def close(self):
        self.conn.close()

# затем создаем один раз объект-соединение и с ним уже работаем
db = DataBase('...')
c = db.cursor
c.execute('CREATE TABLE ...)')
c.execute('INSERT INTO TABLE ...)')
db.commit()
# где нужно используем один и тот же объект-соединение


Во-вторых для выполнения множественных операций (как в данном случае insert) вместо execute есть команда executemany. Ей как раз передается вложенный список строк данных, и она будет исполняться гораздо эффективнее повторного вызова execute по каждой строке.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
tsklab
@tsklab Куратор тега SQL Server
Здесь отвечаю на вопросы.
Не делайте подключение локальной переменной.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
Greenway Global Новосибирск
от 150 000 ₽
SPA2099 Москва
До 100 000 ₽
HR Prime Москва
от 300 000 до 3 800 000 ₽