Вставка нескольких типов в базу данных SQLite с помощью Python - PullRequest
0 голосов
/ 26 декабря 2009

Я пытаюсь создать базу данных SQLite 3 из Python. У меня есть несколько типов, которые я хотел бы вставить в каждую запись: число с плавающей точкой, а затем 3 группы из n чисел с плавающей точкой, в настоящее время это кортеж, но может быть массивом или списком. все различия. Моя проблема - оператор INSERT.

DAS = 12345
lats = (42,43,44,45)
lons = (10,11,12,13)
times = (1,2,3,4,5,6,7,8,9)

import sqlite3
connection = sqlite3.connect("test.db")
cursor = connection.cursor()
cursor.execute( "create table foo(DAS LONG PRIMARY KEY,lats real(4),lons real(4), times real(9) )" )

Я не уверен, что будет дальше. Что-то вроде:

cmd = 'INSERT into foo values (?,?,?,?), ..."
cursor.execute(cmd)

Как лучше всего построить команду вставки SQL с учетом этих данных?

Ответы [ 3 ]

1 голос
/ 26 декабря 2009

Тип real(4) не означает массив / список / кортеж из 4 вещественных чисел; 4 меняет «реальный» тип. Однако SQLite в основном игнорирует типы столбцов из-за его манифестной типизации, но они все равно могут влиять на сходство столбцов .

У вас есть несколько вариантов, таких как сохранение текстового представления (из repr) или использование четырех столбцов, по одному для каждого.

Вы можете изменить это с помощью различных хуков, предоставляемых библиотекой SQLite Python для обработки некоторых преобразований за вас, но отдельными столбцами (с функциями для локализации и обработки различных операторов, поэтому вы не повторяете с собой), вероятно, легче всего работать, если вам нужно искать / etc. в SQL на каждое значение.

Если вы сохраните текстовое представление, ast.literal_eval (или eval, при особых условиях) преобразуется обратно в объект Python.

0 голосов
/ 01 февраля 2010

(через месяц), два шага:
1. сгладить, например, DAS lats раз в один длинный список, скажем, 18 long
2. сгенерируйте «Вставьте в табличное имя xx (?,?, ... 18 знаков вопроса)» и выполните это.

Test = 1

def flatten( *args ):
    """ 1, (2,3), [4,5] -> [1 2 3 4 5] """
    # 1 level only -- SO [python] [flatten] zzz
    all = []
    for a in args:
        all.extend( a if hasattr( a, "__iter__" )  else [a] )
     if Test:  print "test flatten:", all
    return all

def sqlinsert( db, tablename, *args ):
    flatargs = flatten( *args )  # one long list
    ncol = len(flatargs)
    qmarks = "?" + (ncol-1) * ",?"
    insert = "Insert into tablename %s values (%s)" % (tablename, qmarks)
    if Test:  print "test sqlinsert:", insert
    if db:
        db.execute( insert, flatargs )
        # db.executemany( insert, map( flatargs, rows ))
    return insert

#...............................................................................
if __name__ == "__main__":
    print sqlinsert( None, "Table", "hidiho", (4,5), [6] )
0 голосов
/ 26 декабря 2009

Примерно так:

db = sqlite3.connect("test.db")
cursor = db.cursor()
cursor.execute("insert into foo values (?,?,?,?)", (val1, val2, val3, val4))
db.commit() # Autocommit is off by default (and rightfully so)!

Обратите внимание, что я не использую форматирование строк для ввода фактических данных в запрос, но вместо этого заставляю библиотеку делать эту работу за меня. Таким образом, данные цитируются и экранируются правильно.

РЕДАКТИРОВАТЬ: Очевидно, учитывая схему вашей базы данных, она не работает. Нецелесообразно пытаться сохранить значение типа коллекции в одном поле базы данных sqlite . Если я вас правильно понимаю, вам просто нужно создать отдельный столбец для каждого значения, которое вы храните в одной строке. Конечно, это будет много столбцов, но это самый естественный способ сделать это.

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