Форум программистов, компьютерный форум, киберфорум
Python: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
 Аватар для Goncharikkk
2 / 1 / 2
Регистрация: 21.08.2018
Сообщений: 26

Python -> SQL . Сравнить таблицы, присвоить результат!?

21.08.2018, 12:06. Показов 6277. Ответов 11

Студворк — интернет-сервис помощи студентам
Ребят помогите разобраться, опишу задачу и с чем столкнулся.

ЗЫ Я новичок тапками не бросайте. Спасибо!

ТЗ. Есть 3 таблицы в БД, Нужно что бы скрипт сравнивал Табл.1 с Табл.2 и разницу, если она есть записывал в Табл.3
Что получилось набросать у меня:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import pyodbc
connection = pyodbc.connect(
    'DRIVER={SQL Server};'
    'SERVER=TRASSIR-OFFICE\SQLEXPRESS;'
    'DATABASE=master;'
    'UID=sa;'
    'PWD=12345'
    )
 
if connection:
    print ("Yes!\n")
 
cursor = connection.cursor()
 
cursor.execute("SELECT distinct plate FROM master.dbo.testdax WHERE 1=1 AND plate NOT IN (SELECT [plate] FROM [master].[dbo].[whitelist])")
results = cursor.fetchall ()
 
print (results)
 
cursor.close()
connection.close()
На выходи получаю разницу табл.1 и табл.2
Подскажите хочу присвоить эту разницу к переменной , что бы записать в табл.3 !? Как понял, использовать cursor 2 раза нельзя ?

Пробовал как-то так :

Python
1
2
3
4
5
if results != 0 :
sql = ("INSERT INTO control(plate) VALUES (%results)" %results)
print (results)
else:
print ("test")
Выполняется, но не записывает результат.

За любую подсказку, крепко жму руку !

pyhton 2.7/SQL Serv 2016 /Win10
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.08.2018, 12:06
Ответы с готовыми решениями:

результат запроса linq to sql содержит данные обеих таблиц, картографированных на классы. Я хочу результат присвоить в GridControl.DataSource
Здравствуйте! У меня есть две таблицы T1(id_t1(PK),name), T2(id_t2(PK), id_t1(FK), date) отображенных на классы при помощи linq to sql и...

Присвоить переменной результат запроса SQL
Доброй ночи всем! Помогите с таким вопросом. MS SQL 2008, туда импортирован справочник БИК. На форме несколько DBEdit, 1 заполняется...

Присвоить переменной результат запроса sql
Добрий день! есть запрос SELECT replace(a.dealno,'_KI','') dealno , a.id FROM...

11
1741 / 913 / 480
Регистрация: 05.12.2013
Сообщений: 3,074
21.08.2018, 12:43
Цитата Сообщение от Goncharikkk Посмотреть сообщение
Пробовал как-то так :
if results != 0 :
sql = ("INSERT INTO control(plate) VALUES (%results)" %results)
print (results)
else:
print ("test")
Выполняется, но не записывает результат.
Тут нечему выполняться, sql это просто строка, если ее засунуть в cursor.execute(sql), тогда может что-нибудь и получится
0
 Аватар для Goncharikkk
2 / 1 / 2
Регистрация: 21.08.2018
Сообщений: 26
21.08.2018, 13:06  [ТС]
ТабуретY
Может ли выполняться 2 раза cursor.execute ? Как обратиться к результату? Попробовал заменить SQL на cursor.execute
<details>
<summary>Ошибка</summary>cursor.execute("INSERT INTO control(plate) VALUES (%results)" %results)
pyodbc.ProgrammingError: ('42000', '[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]\xe8\xe4\xe5\xed\xf2\xe8\xf4\xe8\xea\xe0 \xf2\xee\xf0, \xea\xee\xf2\xee\xf0\xfb\xe9 \xed\xe0\xf7\xe8\xed\xe0\xe5\xf2\xf1\xff \xf1 "(u\'\\u0410\\u041d 7375 \\u0421\\u0415\', ), (u\'\\u0410\\u041d 7376 \\u0421\\u0415\', ), (u\'\\u0410\\u041d 7377 \\u0421\\u0415\', ), (u\'\\u0410\\u", \xf1\xeb\xe8\xf8\xea\xee\xec \xe4\xeb\xe8\xed\xed\xfb\xe9. \xcc\xe0\xea\xf1\xe8\xec\xe0\xeb\xfc\xed \xe0\xff \xe4\xeb\xe8\xed\xe0 \xf1\xee\xf1\xf2\xe0\xe2\xeb\xff\xe5\xf2 128. (103) (SQLExecDirectW); [42000] [Microsoft][ODBC SQL Server Driver][SQL Server]\xcd\xe5\xef\xf0\xe0\xe2\xe8\xeb\xfc\xed \xfb\xe9 \xf1\xe8\xed\xf2\xe0\xea\xf1\xe8\xf1 \xee\xea\xee\xeb\xee \xea\xee\xed\xf1\xf2\xf0\xf3\xea\xf6\xe8 \xe8 "esults". (102)')
</details>

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import pyodbc
 
 
connection = pyodbc.connect(
    'DRIVER={SQL Server};'
    'SERVER=TRASSIR-OFFICE\SQLEXPRESS;'
    'DATABASE=master;'
    'UID=sa;'
    'PWD=12345'
    )
 
if connection:
    print ("Yes!\n")
 
cursor = connection.cursor()
 
cursor.execute("SELECT distinct plate FROM master.dbo.testdax WHERE 1=1 AND plate NOT IN (SELECT [plate] FROM [master].[dbo].[whitelist])")
 
results = cursor.fetchall ()
 
if results != 0 :
    cursor.execute("INSERT INTO control(plate) VALUES (%results)" %results)
    print (results)
else:
    print ("test")
 
 
cursor.close()
connection.close()
Думаю ...(%results)" %results) ошибка в синтаксисе ?

Как правильно обратиться к результату первого запроса ?
cursor.execute("SELECT distinct plate FROM master.dbo.testdax WHERE 1=1 AND plate NOT IN (SELECT [plate] FROM [master].[dbo].[whitelist])")
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
21.08.2018, 13:53
Цитата Сообщение от Goncharikkk Посмотреть сообщение
(%results)
Зачем это? Какие в MS SQL server\pyodbc плейсхолдеры? Судя по докам pyodbc это ?
Python
1
cursor.execute("select a from tbl where b=? and c=?", x, y)
У вас results это список кортежей. То есть множество строк со всеми полями. Чтобы вставить в БД сразу много строк нужно использовать executemany. Опять же пример из доков pyodbc (может, попробуете тоже почитать?)
Python
1
2
params = [ ('A', 1), ('B', 2) ]
executemany("insert into t(name, id) values (?, ?)", params)
И где у вас commit()? Или pyodbc делает автокоммит?
И зачем квадратные скобки вокруг имени полей в запросе? В MS SQL Server это вместо кавычек-апострофов?

Цитата Сообщение от Goncharikkk Посмотреть сообщение
Как правильно обратиться к результату первого запроса ?
Он у вас в results. Какое еще обращение вам нужно?
0
 Аватар для Goncharikkk
2 / 1 / 2
Регистрация: 21.08.2018
Сообщений: 26
21.08.2018, 14:09  [ТС]
Garry Galler,

И зачем квадратные скобки вокруг имени полей в запросе? В MS SQL Server это вместо кавычек-апострофов?
Если без скобок, имеем ошибку:
Недопустимое имя объекта "master.dbo.SB".

И где у вас commit()? Или pyodbc делает автокоммит?
Сохранения после внесения в базу ? Его не хватает как я понял.

(может, попробуете тоже почитать?)
Не всегда правильно получается сформировать запрос в поисковик.

Ушел читать, Спасибо за подсказки !

Результат отпишу Пиши для усвоение подкинул, СПАСИБО !
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
21.08.2018, 15:50
Цитата Сообщение от Garry Galler Посмотреть сообщение
И зачем квадратные скобки вокруг имени полей в запросе?
Это оказывается чисто "фича" MS, для экранирования полей\имен которые не отвечают требованиями к идентификаторам или совпадают с зарезервированными именами... Сомнительная фича... Делает код совершенно не совместимым с традиционным диалектом SQL, который используется в остальных БД.

Цитата Сообщение от Goncharikkk Посмотреть сообщение
Сохранения после внесения в базу ?
Ну я так понял автокоммит вроде по умолчанию в MS Server не включен, значит нужно коммитить после добавления данных.
Хотя, может ошибаюсь - я c MS Server не работал.

Цитата Сообщение от Goncharikkk Посмотреть сообщение
Не всегда правильно получается сформировать запрос в поисковик.
Все доки по либам либо на гитхабе, где лежит исходный код, либо там есть ссылка на сайт.
У pyodbc есть wiki c документацией - на github рядом с исходниками.
https://github.com/mkleehammer/pyodbc/wiki
0
 Аватар для Goncharikkk
2 / 1 / 2
Регистрация: 21.08.2018
Сообщений: 26
21.08.2018, 16:34  [ТС]
Garry Galler,

params = [ ('A', 1), ('B', 2) ]
executemany("insert into t(name, id) values (?, ?)", params)
Пример из Github ?

params = [ ('A', 1), ('B', 2) ] - не могу понять данную строку,
values (?, ?) - (?) плейсхолдер ?

executemany=("insert into control(plate) values (?)", results) - как вместо (?) подставить значение results?

Принимаю заказы. Отнимаю деньги. Дарю время.
А какая форма связи с вами есть? Благодарю за подсказки и за уделенное время.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
21.08.2018, 16:54
Цитата Сообщение от Goncharikkk Посмотреть сообщение
не могу понять данную строку
Это список кортежей. Каждый кортеж - одна запись в БД. Значения в кортеже - значения полей таблицы, которые мы собираемся заполнить (сами поля указывается в SQL запросе).
Плейсхолдер это символ-заменитель (для чего используется - погуглите).

При условии, что в results список кортежей и в кортеже только одно поле:
Python
1
cursor.executemany("INSERT INTO control(plate) VALUES (?)",results)
0
 Аватар для Goncharikkk
2 / 1 / 2
Регистрация: 21.08.2018
Сообщений: 26
21.08.2018, 17:20  [ТС]
Garry Galler,

print ( results ) выводит [(u'\u0410\u041d 7375 \u0421\u0415', ), (u'\u0410\u041d 7376 \u0421\u0415', ), (u'\u0410\u041d 7377 \u0421\u0415', ), (u'\u0410\u041d 7378', )]

Но этот список может меняться в зависимости от обновление базы,results будет разный, Как тогда быть с params ?

SELECT distinct plate FROM master.dbo.testdax WHERE 1=1 AND plate NOT IN (SELECT [plate] FROM [master].[dbo].[whitelist])
Выводит результат "смотри скрин".

u'\u0410\u041d 7375 \u0421\u0415', - а что это за u ?

Может дашь контакты ? я на пиво подкину, за помощь ?
Миниатюры
Python -> SQL . Сравнить таблицы, присвоить результат!?  
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
21.08.2018, 18:26
Примерный подход:
SQL
1
2
3
4
SELECT t1.name
FROM table1 t1
LEFT JOIN table2 t2 ON t2.name = t1.name
WHERE t2.name IS NULL
0
 Аватар для Goncharikkk
2 / 1 / 2
Регистрация: 21.08.2018
Сообщений: 26
22.08.2018, 16:17  [ТС]
Garry Galler, Спасибо ! Получилось, разница двух таблиц падает в третью
Буду копать дальше и дорабатывать, не очень разобрался с кортежами и params, но все впереди

dondublon,

Переделал на JOIN, Спасибо

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import pyodbc
 
connection = pyodbc.connect(
    'DRIVER={SQL Server};'
    'SERVER=TRASSIR-OFFICE\SQLEXPRESS;'
    'DATABASE=master;'
    'UID=sa;'
    'PWD=12345'
    )
 
if connection:
    print ("Yes!\n")
 
cursor = connection.cursor()
 
cursor.execute("SELECT distinct testdax.plate FROM testdax "
               "LEFT JOIN whitelist ON whitelist.plate = testdax.plate "
               "WHERE whitelist.plate IS NULL ")
 
results = cursor.fetchall ()
 
if results != 0:
    params = [('a', 1)]
    cursor.executemany("insert into control(plate) values (?)", results )
    print (results)
else:
    print ("OK")
 
connection.commit()
cursor.close()
connection.close()
0
 Аватар для Goncharikkk
2 / 1 / 2
Регистрация: 21.08.2018
Сообщений: 26
27.08.2018, 15:59  [ТС]
Ребят подскажите пожалуйста!

Что возвращается в results если результат SELECT запроса , пустая строка(совпадений в базе не найдено) !?

if results != 0: <- Если в results есть значения, все работает как нужно. Когда результат пустой, он очевидно не "0" и до else не доходит.

Спасибо !

Добавлено через 27 минут
Разобрался) оказалось проще чем думал.

if results != []:

Можно я тут сам с собой поговорю? Мне так легче работать
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.08.2018, 15:59
Помогаю со студенческими работами здесь

Переменно присвоить результат выполнения SQL скрипта
форумчане, с bash только начинаю знакомится. подскажите, в bash переменной могу присвоить результат SQL скрипта. переменная a ...

Как sql-ой командой присвоить полю date первой таблицы значение поля date второй таблицы?
Добрый день. Есть 2 таблицы aaa с полями name, date bbb с полями name, date как sql-ой командой присвоить полю date первой...

Как можно сравнить две таблицы sql-ля?
Спасибо, а как можно сравнить две таблицы sql-ля в C# пе? Например у меня есть справочники(норма), и пациент сдает анализы. Надо что бы...

Результат нашего запроса из таблицы sql server
помоги пожалуйста сделать клиент на с шарпе, в котором будет выводиться результат нашего запроса из таблицы sql server, есть 2 таблички, в...

Python. Интерфейс для SQL таблицы
Здравствуйте! Суть в следующем: беру запрос, превращаю в датафрейм пандаса. Нашёл как вывести через PyQt6 этот датафрейм. Есть возможность...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru