Присоединение к LocalDb MS SQL
Предыстория такова: Работаем с К3Мебель версии 8.0. Требуется соединиться с локальной базой, которая теперь MS SQL LocalDB для автоматизации процесса обновления и добавления записей.
Соединение при помощи pyodbc
>>> import pyodbc
>>> connectionString=r"DRIVER={SQL Server Native Client 11.0};SERVER=(LocalDB)\v11.0;DATABASE=c:\K3-PKM-80_\Base\17.01.2021 21.11.21\NGuidesSQLNew.mdf;"
>>> conx = pyodbc.connect(connectionString)
>>> cursor = conx.cursor()
>>> cursor.execute('SELECT * FROM NNomenclature ')
<pyodbc.Cursor object at 0x02F68720>
>>> for row in cursor:
... print('---', row)
...
------ (36, 'Бумага', 16, 79, None, 9, 67.0, 2, None, 'DFAA21D5-3BD7-45FA-B120-1CACEAA30688', 0)
--- (37, 'Шпагат', 16, 79, None, 9, 95.0, 3, None, '2601BC12-C6E7-4D1F-8005-2623E7937512', 0)
--- (45, 'Мел закр.', 16, 79, None, 4, 15.93, 4, None, 'EAB70030-25B6-4250-906D-93AE411566FB', 0)
--- (46, 'Пакет уп.', 16, 79, None, 4, 28.0, 5, None, 'F01B3300-D625-4181-9F4F-E4E13FF7627D', 0)
--- (55, 'Стяжка 01', 43, 137, None, 10, 245.0, 6, None, '97A13AB7-AD67-4167-A79B-6F0842FF9CA5', 0)
--- (56, 'Стяжка 02', 43, 137, None, 10, 254.0, 7, None, '2ABC491C-2E84-4719-B5D0-AFADB3B38B12', 0)
--- (58, 'Наконечник', 3, 70, None, 4, 12.0, 8, None, 'A60AA804-DCD8-4429-8594-566237FA2D72', 0)
>>> conx.Close()
Соединение при помощи win32com.client
Полезная ссылка https://www.connectionstrings.com/sql-server/
>>> import win32com.client
>>> con = win32com.client.Dispatch(r'ADODB.Connection')
>>> RS = win32com.client.Dispatch(r'ADODB.Recordset')>>> connectionString=r"DRIVER={SQL Server Native Client 11.0};SERVER=(LocalDB)\v11.0;DATABASE=c:\K3-PKM-80_\Base\17.01.2021 21.11.21\NGuidesSQLNew.mdf;"
>>> con.Open(connectionString)
>>> con
<COMObject ADODB.Connection>
>>> sqlstr = "SELECT * FROM NNomenclature"
>>> RS.Open(sqlstr, con, 3, 1)
Узнаём число строк в рекордсете
>>> RS.RecordCount
3780
Теперь можно сформировать словарь по столбцам. Автор Куликов Денис.
>>> def SQLtoDICT(RS, listCheck=[]):
... '''Преобразует SQL в словарь'''
... nmDRS = {}
... KeyCheck = False if len(listCheck) == 0 else True
... if not (RS.BOF or RS.EOF):
... rows = zip(*RS.GetRows())
... for item in rows:
... for fld in range(len(item)):
... nameFld = RS.Fields.Item(fld).Name
... if (nameFld in listCheck) or not KeyCheck:
... if nameFld not in nmDRS:
... nmDRS[nameFld] = [item[fld]]
... else:
... nmDRS[nameFld].append(item[fld])
...
... return nmDRS
...
Словарь длиннющий, поэтому не привожу в примере вывод словаря, а только запрошу keys.
Потому что за каждым ключевым полем список длиной 3780 элементов
>>> d = SQLtoDICT(RS)
>>> d.keys()
dict_keys(['ID', 'Name', 'MatKindID', 'GroupID', 'Article', 'UnitsID', 'Price', 'USort', 'ParentID', 'GUID', 'ConnectionLibraryID'])
А если просто пробежаться по строкам...
>>> RS.Close()
>>> RS.Open(sqlstr, con, 3, 1)
>>> if not (RS.BOF or RS.EOF):
... rows = zip(*RS.GetRows())
... for item in rows:
... print(item)
...
(12, 'Белая', 12, 61, None, 11, 1.0, 1, None, '{BCD9C861-C42C-4D04-907E-0B7243AB1B40}', 0)(36, 'Бумага', 16, 79, None, 9, 67.0, 2, None, '{DFAA21D5-3BD7-45FA-B120-1CACEAA30688}', 0)
(37, 'Шпагат', 16, 79, None, 9, 95.0, 3, None, '{2601BC12-C6E7-4D1F-8005-2623E7937512}', 0)
(45, 'Мел закр.', 16, 79, None, 4, 15.93, 4, None, '{EAB70030-25B6-4250-906D-93AE411566FB}', 0)
(46, 'Пакет уп.', 16, 79, None, 4, 28.0, 5, None, '{F01B3300-D625-4181-9F4F-E4E13FF7627D}', 0)
(55, 'Стяжка 01', 43, 137, None, 10, 245.0, 6, None, '{97A13AB7-AD67-4167-A79B-6F0842FF9CA5}', 0)
....
(5286, 'Пластик 19х2 венге', 12, 150, None, 1, 5.64, 4977, None, '{95FE6577-5F96-452E-B1B0-CE3DAA478382}', 0)
(5287, 'Пластик 19х2 дуб молочный', 12, 150, None, 1, 5.64, 4978, None, '{64BC96D0-66E7-4D06-B0AD-AE713F478F5E}', 0)
>>> RS.Close()
>>> con.Close()
Связь с рабочим сервером
Обязательное условие -- это наличие логина и пароля. Требуется установить в свойствах базы.
Использую win32.
У меня запущен сервер MS SQL Express 12. Строка подключения, стало быть такая:
>>> connectionString=r"DRIVER={SQL Server};SERVER=WIN-VххххIIED2;DATABASE=C:\PKM_BETA80\DATAAPP\BASE\NGUIDESSQLNEW.MDF;UID=alexххх;PWD=хххх"
>>> ss = con.Open(connectionString)
>>> sqlstr = 'select * from tprotolib'
>>> RS.Open(sqlstr, con, 3, 1)
>>> if not (RS.BOF or RS.EOF):
... rows = zip(*RS.GetRows())
... for item in rows:
... print(item)
...
(1, 'Shkaf', 'Проектирование мебели', '<Proto>\\', 1, 1, '{E30060B0-2EF0-4ED8-AF1A-912BCB3B4896}', False, 0)
(2, 'Kitchen', 'Кухонная мебель', '<Proto>\\Kitchen\\', 2, 2, '{090634AC-78E3-4725-AE82-2D4EE3934405}', False, 0)
(3, 'Office', 'Офисная мебель', '<Proto>\\Office\\', 3, 2, '{BF4DD608-DED5-4E3F-B150-F281A4B56680}', False, 0)
(5, 'Bathroom', 'Ванные комнаты', '<Proto>\\Baths\\', 5, 2, '{C0820589-69F1-4EC1-B609-0CB2A3A5A7AD}', False, 0)
(6, 'Medical', 'Мебель для больничных палат', '<Proto>\\Medical\\', 6, 2, '{0349A158-3744-45DA-8629-CCAD079D11B3}', False, 0)
(7, 'Kupe', 'Шкафы-купе', '<Proto>\\Kupe\\', 7, 2, '{16F2C9DC-7981-4115-8463-C3982335EFED}', False, 0)
(10, 'Windows', 'Окна', '<Proto>\\Windows\\', 10, 1, '{AAFCBC38-0535-422E-8316-8792BB41A213}', True, 0)
(11, 'Doors', 'Двери', '<Proto>\\Doors\\', 11, 1, '{EFDC8C65-D40A-426C-BE3F-174D8196073A}', True, 0)
(12, 'Contour', 'Контуры вырезов панели', '<Proto>\\Contour\\', 12, 1, '{90555303-80B1-4BD4-A428-899CB0933537}', True, 0)
(16, 'Mmebel', 'Мягкая мебель', '<Proto>\\SoftMebel\\', 8, 2, '{004EBCE2-AA6C-4A14-9BE2-28E62ADE4095}', False, 0)
Комментарии
Отправить комментарий