вставка и объединение в базе данных Access с использованием pyodbc

#python #database #ms-access #pyodbc

#python #База данных #ms-access #pyodbc

Вопрос:

У меня есть база данных MS access, и я хочу работать с ней из Python. Цель состоит в том, чтобы иметь таблицу «units», которая включает в себя все, и для достижения этой цели я хотел бы вставить информацию в таблицу «units_temp», а затем объединить их в таблицы.

Код еще не завершен, но на данный момент я борюсь с заполнением случайного идентификатора (цель состоит только в том, чтобы не быть вынужденным менять идентификатор в коде вручную каждый раз, когда я хочу попробовать код до того, как все функции будут установлены).

 import pyodbc
from random import randint

random_id = randint(0,10000)

conn = pyodbc.connect(r'Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:Usersaaa.bbbDocumentsPython ScriptsDBTest_db.accdb;')
cursor = conn.cursor()


mySql_insert_query='''INSERT INTO Units (client_id,client_first_name,client_last_name,units_ordered,product_price_per_unit,product_name) VALUES (%s,%s,%s,%s,%s,%s)'''

cursor.execute('''
               INSERT INTO Units (client_id,client_first_name,client_last_name,units_ordered,product_price_per_unit,product_name)
               VALUES ('124','aa','bb','2','500','phones')               
               ''')

recordTuple = (random_id,'aa','bb','99','900','random')
cursor.execute(mySql_insert_query,recordTuple)

JoinQuery = "SELECT Units.client_id from Units INNER JOIN Units_temp on (Units.client_id=Units_temp.Client_id)"
cursor.execute(JoinQuery) 

conn.commit()
  

Я получаю следующую ошибку
Ошибка программирования: (‘42000’, «[42000] [ Microsoft] [Драйвер ODBC Microsoft Access] Синтаксическая ошибка в выражении запроса ‘%s’. (-3100) (SQLPrepare)»)

Ответ №1:

pyodbc использует ? в качестве заполнителя параметра not %s , поэтому ваша строка запроса должна быть

 mySql_insert_query='''INSERT INTO Units (client_id,client_first_name, … ) VALUES (?,?, … )'''
  

затем вы выполняете его с

 cursor.execute(mySql_insert_query,recordTuple)
  

как и раньше.

Ответ №2:

Это строка

 mySql_insert_query='''INSERT INTO Units (client_id,client_first_name,client_last_name,units_ordered,product_price_per_unit,product_name) VALUES (%s,%s,%s,%s,%s,%s)'''
  

У вас нет значений для параметра %s. Замените их значениями, как вы делаете в следующей строке.

Кроме того, я серьезно сомневаюсь, что эти поля должны быть текстовыми, а не числовыми:

 units_ordered,product_price_per_unit
  

Комментарии:

1. Идентификатор должен быть, конечно, целым числом, а цена плавающей. Просто пытаюсь решить это поэтапно. Что касается значений, я думал, что добавил его в строку recordTuple =

2. Я бы рекомендовал валюту для product_price_per_unit .

3. Я все еще не отвечаю на вопрос, как я могу вставить строку с переменной (или несколькими переменными), а не только жестко закодированные значения.

4. Простой метод заключается в объединении их в предложении SQL. Рекомендуется настроить ваш запрос с параметрами , присвоить им значения, а затем выполнить. Однако мои знания python равны нулю , поэтому я не могу помочь вам с точным кодом.

5. cc: @NewDev — pyodbc использует ? в качестве заполнителей параметров, а не %s