Я хотел бы несколько советов, почему бы не вставить данные в мою таблицу SQL - PullRequest
1 голос
/ 27 мая 2011

Мой код:

import MySQLdb
def insert_popularity(PersonNumber, Category, Value):

# make a connection to the dataabse
connection = MySQLdb.connect(host='localhost', user='root', \
                             passwd='password', db='inb104')

# get a cursor on the database
cursor = connection.cursor()

# construct the SQL statement
sql = ("""INSERT INTO popularity (PersonNumber, Category, Value)
        VALUES(%s, %s, %s)""", (number, category, data))

def open_file(filename):        
    txt_file = file(filename, 'r')
    for line in txt_file:
        # Split the line on whitespace
        for value in line.split():                
            return value

            number = value[0]
            data = value[1]

# execute the query
cursor.execute(sql)

# commit the changes to the database\
connection.commit()

# close the cursor and connection
cursor.close()

connection.close()

Обновление:

После изменения моего кода согласно предложению Пауло Теперь я получаю эту ошибку:

query() argument 1 must be string or read-only buffer, not tuple. 

Я не уверен, что это после попытки изменить мой код:

def insert_popularity(Category, filename, cursor):

    txt_file = file(filename, 'r')
    for line in txt_file:
            # Split the line on whitespace
        number, value = line.split()
            # construct the SQL statement
        sql = ("""INSERT INTO popularity (PersonNumber, Category, Value)
                VALUES(%s, %s, %s)""", (number, Category, value))
            # execute the query
        cursor.execute(sql)

connection = MySQLdb.connect(host='localhost', user='root', \
                                 passwd='password', db='dogs')

cursor = connection.cursor()

Category = 'dogs'
insert_popularity(Category, 'dogs.txt', cursor)
connection.commit()
cursor.close()
connection.close()

Ответы [ 5 ]

2 голосов
/ 27 мая 2011

Просто сделайте это просто, по одной за раз, никаких причудливых вещей, которые подвержены ошибкам и замедляют читателя, пока он перемещается по запутыванию:

sql = """INSERT INTO popularity (PersonNumber, Category, Value) VALUES (%s, %s, %s)"""
args = (number, Category, value)
cursor.execute(sql, args)

Ваш комментарий (выполнить запрос) пропалпотому что (а) это было неправильно (вставить! = запрос) и (б) исправленная версия (выполнить вставку) была бы излишней, учитывая ясность фиксированного кода.

Обновление после новой проблемы (слишком много значений для распаковки):

Вместо этого кода:

for line in txt_file:
        # Split the line on whitespace
    number, value = line.split()

сделать это:

for lino, line in enumerate(txt_file, 1):
    pieces = line.split()
    if len(pieces) != 2:
        print "Bad data in line %d: %r" % (lino, pieces)
        continue
    number, value = pieces
2 голосов
/ 27 мая 2011

Вы создали запрос для выполнения в виде кортежа.Есть две возможности решить эту проблему:

  1. Использовать созданный запрос (sql) в качестве списка аргументов:

    sql = ("""INSERT INTO popularity (PersonNumber, Category, Value) VALUES(%s, %s, %s)""", (number, Category, value)) # execute the query cursor.execute(*sql)

  2. Непосредственно добавить запрос в метод execute:

    cursor.execute("""INSERT INTO popularity (PersonNumber, Category, Value) VALUES(%s, %s, %s)""", (number, Category, value))

Номер 2 определенно является лучшим вариантом, чем первый.Спасибо всем комментариям!

1 голос
/ 28 мая 2011

Попробуйте так:

def insert_popularity(Category, filename, cursor):
    sql = """INSERT INTO popularity (PersonNumber, Category, Value)
           VALUES(%s, %s, %s)"""

    txt_file = file(filename, 'r')
    for line in txt_file:
        # Split the line on whitespace
        number, value = line.split()
        # execute the query
        cursor.execute(sql, (number, Category, value))
    txt_file.close()

connection = MySQLdb.connect(host='localhost', user='root', \
                                 passwd='password', db='dogs')

cursor = connection.cursor()

Category = 'dogs'
insert_popularity(Category, 'dogs.txt', cursor)

connection.commit()
cursor.close()
connection.close()

Также обратите внимание: ваш код предполагает, что это база данных MySQL;если это база данных SQLite, как говорится в заголовке вашего вопроса, замените '?' на каждый '%s' в выражении sql.

1 голос
/ 27 мая 2011

Не поймите меня неправильно, но код очень запутан ...

  1. возврат в цикл for вернет первую разделенную строку в первой строке.
  2. open_file определен, но никогда не вызывается

и так далее ...

Мой результат будет выглядеть примерно так:

def process_file(category, filename, cursor):
    txt_file = file(filename, 'r')
    for line in txt_file:
        number, value = line.split()
        sql = ("""INSERT INTO popularity (PersonNumber, Category, Value)
            VALUES(%s, %s, %s)""", (number, category, data))
        cursor.execute(sql)

connection = MySQLdb.connect(host='localhost', user='root',
                         passwd='password', db='inb104')
# get a cursor on the database
cursor = connection.cursor()
category = 'foo'
process_file(category, 'somefile.txt', cursor)
# commit the changes to the database\
connection.commit()
# close the cursor and connection
cursor.close()
connection.close()
1 голос
/ 27 мая 2011

Каковы типы данных числа, категории и данных?Если какая-либо из этих строк является строкой, то в запросе следует заключить их в одинарные кавычки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...