#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