سؤال

أواجه صعوبة في استخدام وحدة MySQLDB لإدراج المعلومات في قاعدة البيانات الخاصة بي. أحتاج إلى إدراج 6 متغيرات في الجدول.

cursor.execute ("""
    INSERT INTO Songs (SongName, SongArtist, SongAlbum, SongGenre, SongLength, SongLocation)
    VALUES
        (var1, var2, var3, var4, var5, var6)

""")

هل يمكن لشخص مساعدتي في بناء الجملة هنا؟

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

المحلول

احذر من استخدام الاستيفاء السلسلة لاستعلامات SQL، نظرا لأنها لن تفلت من معلمات الإدخال بشكل صحيح وسوف تترك تطبيقك مفتوحا لمكثير حقن SQL. قد يبدو الفرق تافه، ولكن في الواقع هو ضخم.

غير صحيح (مع مشاكل الأمان)

c.execute("SELECT * FROM foo WHERE bar = %s AND baz = %s" % (param1, param2))

صحيح (مع الهروب)

c.execute("SELECT * FROM foo WHERE bar = %s AND baz = %s", (param1, param2))

يضيف إلى الارتباك أن المعدلات المستخدمة في ربط المعلمات في عبارة SQL تختلف بين تطبيقات واجهة برمجة تطبيقات DB المختلفة وأن مكتبة عميل MySQL تستخدم printf بناء جملة نمط بدلا من المقبول بشكل شائع "؟ علامة (المستخدمة من قبل على سبيل المثال python-sqlite).

نصائح أخرى

لديك بعض الخيارات المتاحة. سترغب في الحصول على مرتاح مع إذن سلسلة Python. وهو مصطلح قد يكون لديك المزيد من النجاح في المستقبل في المستقبل عندما تريد معرفة الأشياء مثل هذا.

أفضل للاستعلامات:

some_dictionary_with_the_data = {
    'name': 'awesome song',
    'artist': 'some band',
    etc...
}
cursor.execute ("""
            INSERT INTO Songs (SongName, SongArtist, SongAlbum, SongGenre, SongLength, SongLocation)
            VALUES
                (%(name)s, %(artist)s, %(album)s, %(genre)s, %(length)s, %(location)s)

        """, some_dictionary_with_the_data)

بالنظر إلى أنك ربما تحتوي على جميع بياناتك في كائن أو قاموس بالفعل، فإن التنسيق الثاني سوف يناسبك بشكل أفضل. كما تمتص الأمر للحصول على مظاهر "٪ S" في سلسلة عندما تضطر إلى العودة وتحديث هذه الطريقة في السنة :)

تمنح المستندات المرتبطة المثال التالي:

   cursor.execute ("""
         UPDATE animal SET name = %s
         WHERE name = %s
       """, ("snake", "turtle"))
   print "Number of rows updated: %d" % cursor.rowcount

لذلك تحتاج فقط إلى تكييف هذا إلى الرمز الخاص بك - مثال:

cursor.execute ("""
            INSERT INTO Songs (SongName, SongArtist, SongAlbum, SongGenre, SongLength, SongLocation)
            VALUES
                (%s, %s, %s, %s, %s, %s)

        """, (var1, var2, var3, var4, var5, var6))

(إذا كان طول SongLengn رقمي، فقد تحتاج إلى استخدام٪ D بدلا من٪ s).

في الواقع، حتى إذا كان المتغير الخاص بك (طول Songlengn) رقمي، فلن يتعين عليك تنسيقه مع٪ S من أجل ربط المعلمة بشكل صحيح. إذا حاولت استخدام٪ D، فستحصل على خطأ. إليك مقتطفات صغيرة من هذا الرابط http://mysql-python.sourceforge.net/mysqldb.html.:

لإجراء استعلام، تحتاج أولا إلى مؤشر، ثم يمكنك تنفيذ الاستعلامات على ذلك:

c=db.cursor()
max_price=5
c.execute("""SELECT spam, eggs, sausage FROM breakfast
          WHERE price < %s""", (max_price,))

في هذا المثال، Max_Price = 5 لماذا، إذن، استخدم٪ S في السلسلة؟ نظرا لأن MySQLDB سيؤدي إلى تحويله إلى قيمة حرفية SQL، وهي السلسلة "5". عند الانتهاء، سيقول الاستعلام بالفعل، "... حيث السعر <5".

كبديل للإجابة المختارة، ومع نفس الدلالات الآمنة في Marcel's، إليك طريقة مدمجة لاستخدام قاموس Python لتحديد القيم. لديها فائدة من السهل تعديلها وأنت تضيف أو إزالة الأعمدة لإدراجها:

  meta_cols=('SongName','SongArtist','SongAlbum','SongGenre')
  insert='insert into Songs ({0}) values ({1})'.
        .format(','.join(meta_cols), ','.join( ['%s']*len(meta_cols) ))
  args = [ meta[i] for i in meta_cols ]
  cursor=db.cursor()
  cursor.execute(insert,args)
  db.commit()

أين ميتا هو القاموس الذي يحمل القيم لإدراج. يمكن إجراء التحديث بنفس الطريقة:

  meta_cols=('SongName','SongArtist','SongAlbum','SongGenre')
  update='update Songs set {0} where id=%s'.
        .format(','.join([ '{0}=%s'.format(c) for c in meta_cols ]))
  args = [ meta[i] for i in meta_cols ]
  args.append( songid )
  cursor=db.cursor()
  cursor.execute(update,args)
  db.commit()

هنا طريقة أخرى للقيام بذلك. انها موثقة على موقع MySQL الرسمي.https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-execute.html.

في الروح، يستخدم نفس ميكانيكي إجابة Rey Stout. ومع ذلك، أجد هذا أجمل وأكثر قابلية للقراءة.

insert_stmt = (
  "INSERT INTO employees (emp_no, first_name, last_name, hire_date) "
  "VALUES (%s, %s, %s, %s)"
)
data = (2, 'Jane', 'Doe', datetime.date(2012, 3, 23))
cursor.execute(insert_stmt, data)

ولتحسين توضيح أي حاجة للمتغيرات:

ملحوظة: لاحظ الهروب يجري القيام به.

employee_id = 2
first_name = "Jane"
last_name = "Doe"

insert_stmt = (
  "INSERT INTO employees (emp_no, first_name, last_name, hire_date) "
  "VALUES (%s, %s, %s, %s)"
)
data = (employee_id, conn.escape_string(first_name), conn.escape_string(last_name), datetime.date(2012, 3, 23))
cursor.execute(insert_stmt, data)

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

temp = "100"
myCursor.execute("UPDATE testDB.UPS SET netAmount = %s WHERE auditSysNum = '42452'",(temp,))
myCursor.execute(var)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top