Маленькие таблицы в Python?

Можно сделать:

select 
  count(<columnName>)
from
  <tableName>

, Если количество возвращается 0, который означает, что все строки в том столбце весь ПУСТОЙ УКАЗАТЕЛЬ (или нет никаких строк вообще в таблице)

может быть изменен на

select 
    case(count(<columnName>)) when 0 then 'Nulls Only' else 'Some Values' end
from 
    <tableName>

, Если Вы хотите автоматизировать его, можно использовать системные таблицы для итерации имен столбцов в таблице, Вы интересуетесь

13
задан Brian Tompsett - 汤莱恩 11 January 2017 в 08:54
поделиться

3 ответа

Для небольших проблем, связанных с отношениями, я люблю использовать встроенные наборы Python .

Например, location = 'Boston' OR type = 'Primary', если у вас есть это данные:

users = {
   1: dict(Name="Mr. Foo", Location="Boston", Type="Secondary"),
   2: dict(Name="Mr. Bar", Location="New York", Type="Primary"),
   3: dict(Name="Mr. Quux", Location="Chicago", Type="Secondary"),
   #...
}

Вы можете сделать ГДЕ ... ИЛИ ... запрос вроде этого:

set1 = set(u for u in users if users[u]['Location'] == 'Boston')
set2 = set(u for u in users if users[u]['Type'] == 'Primary')
result = set1.union(set2)

Или только с одним выражением:

result = set(u for u in users if users[u]['Location'] == 'Boston'
                              or users[u]['Type'] == 'Primary')

Вы также можете использовать функции в itertools для создания достаточно эффективных запросов данных. Например, если вы хотите сделать что-то похожее на GROUP BY city :

cities = ('Boston', 'New York', 'Chicago')
cities_users = dict(map(lambda city: (city, ifilter(lambda u: users[u]['Location'] == city, users)), cities))

Вы также можете создать индексы вручную (создать dict сопоставление Location с User ID), чтобы ускорить процесс. . Если это станет слишком медленным или громоздким, я, вероятно, переключусь на sqlite , который теперь включен в стандартную библиотеку Python (2.5).

14
ответ дан 1 December 2019 в 22:39
поделиться

Я не думаю, что sqlite будет "излишним" - он поставляется со стандартным Python, начиная с версии 2.5, поэтому нет необходимости устанавливать что-то, и он может создавать и обрабатывать базы данных в файлы в памяти или на локальном диске. Действительно, как может быть проще ...? Если вы хотите, чтобы все в памяти, включая начальные значения, и вы хотите использовать dicts для выражения этих начальных значений, например ...:

import sqlite3

db = sqlite3.connect(':memory:')
db.execute('Create table Users (Name, Location, Type)')
db.executemany('Insert into Users values(:Name, :Location, :Type)', [
   dict(Name="Mr. Foo", Location="Boston", Type="Secondary"),
   dict(Name="Mr. Bar", Location="New York", Type="Primary"),
   dict(Name="Mr. Quux", Location="Chicago", Type="Secondary"),
   ])
db.commit()
db.row_factory = sqlite3.Row

и теперь ваш крошечный «db» в памяти готов к работе. Это' s не сложнее создать БД в файле на диске и / или прочитать начальные значения из текстового файла, CSV и т. д., конечно.

Запросы особенно гибкие, простые и удобные, например, вы можете смешивать вставка строки и замена параметра по желанию ...:

def where(w, *a):
  c = db.cursor()
  c.execute('Select * From Users where %s' % w, *a)
  return c.fetchall()

print [r["Name"] for r in where('Type="Secondary"')]

излучает [u'Mr. Foo ', u'Mr. Quux '] , точно так же, как более элегантный, но эквивалентный

print [r["Name"] for r in where('Type=?', ["Secondary"])]

и ваш желаемый запрос только:

print [r["Name"] for r in where('Location="Boston" or Type="Primary"')]

и т. Д. Серьезно - что не нравится?

5
ответ дан 1 December 2019 в 22:39
поделиться

Если это действительно небольшой объем данных, я бы не стал заморачиваться с индексом и, вероятно, просто написал бы вспомогательную функцию:

users = [
   dict(Name="Mr. Foo", Location="Boston", Type="Secondary"),
   dict(Name="Mr. Bar", Location="New York", Type="Primary"),
   dict(Name="Mr. Quux", Location="Chicago", Type="Secondary"),
   ]

def search(dictlist, **kwargs):
   def match(d):
      for k,v in kwargs.iteritems():
         try: 
            if d[k] != v: 
               return False
         except KeyError:
            return False
      return True

   return [d for d in dictlist if match(d)] 

Которая позволит выполнять красивые запросы вроде этого:

result = search(users, Type="Secondary")
2
ответ дан 1 December 2019 в 22:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: