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()
  • Вопрос задан
  • 253 просмотра
Решения вопроса 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
Здесь отвечаю на вопросы.
Не делайте подключение локальной переменной.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы