Python sqlite3 cursor.execute () مع المعلمات يؤدي إلى خطأ في بناء الجملة بالقرب من؟ (ParamStyle Qmark)

StackOverflow https://stackoverflow.com/questions/19843668

سؤال

بعد البحث حتى الجنون ، قررت نشر سؤال هنا. أحاول إنشاء قاعدة بيانات SQLITE3 حيث أرغب في الاستفادة من وظيفة الإحلال المتغير الآمن لوظيفة Cursor.execute (SQL ، Param). وظيفتي تذهب هكذا:

#!/usr/bin/env python3
#-*- coding: utf-8 -*-

import sqlite3

def create():
    values = ("data")
    sql = "CREATE TABLE IF NOT EXISTS ? ( name TEXT, street TEXT, time REAL, age INTEGER )"

    con = sqlite3.connect("database.db")
    c = con.cursor()
    c.execute(sql, values)
    con.commit()
    c.close()
    con.close()

if __name__ = "__main__":
    create()

أعلم أن الوسيطة الأولى يجب أن تكون أمر SQL في شكل سلسلة ويجب أن تكون الوسيطة الثانية بمثابة انتقام للقيم التي من المفترض أن يتم استبدالها أين؟ هو في سلسلة SQL. ومع ذلك ، عندما أقوم بتشغيل الملف ، فإنه يعيد الخطأ التالي:

$ ./test.py 

Traceback (most recent call last):
  File "./test.py", line 21, in <module>
    create()
  File "./test.py", line 14, in create
    c.execute(sql, values)
sqlite3.OperationalError: near "?": syntax error

يحدث هذا أيضًا عند تعيين ParamStyle على اسمه (على سبيل المثال نموذج الجدول). لا يمكنني اكتشاف خطأ في بناء الجملة هنا ، لذلك أعتقد أنه يجب أن تكون المشكلة في مكان ما في النظام. لقد اختبرته على تثبيت Archlinux و Debian ، وكلاهما ينشر لي نفس الخطأ.

الآن ، لقد انتهى الأمر ، حيث لم يعد لدي أي فكرة عن مكان البحث عن القضية.

هل كانت مفيدة؟

المحلول

يمكن أن تنطبق معلمات SQL فقط على الإدراج بيانات, ، وليس أسماء الجدول. وهذا يعني أن المعلمات ليست حتى تحليل عبارات DDL.

لذلك سيكون عليك استخدام تنسيق السلسلة:

sql = "CREATE TABLE IF NOT EXISTS {} ( name TEXT, street TEXT, time REAL, age INTEGER )".format(*values)

نصائح أخرى

كما أفهم ، معلمتك هي اسم الجدول؟

لذلك سيكون أمرك

tbl = 'my_table'
sql = "CREATE TABLE IF NOT EXISTS '%s' ( name TEXT, street TEXT, time REAL, age INTEGER )" % tbl
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top