إرجاع جدول SQL كـ JSON في python




(6)

أبسط طريقة ،

استخدم json.dumps ولكن إذا كان سيتطلب تاريخه تحليل التاريخ إلى json serializer.

تلك هي خاصتي،

import MySQLdb, re, json
from datetime import date, datetime

def json_serial(obj):
    """JSON serializer for objects not serializable by default json code"""

    if isinstance(obj, (datetime, date)):
        return obj.isoformat()
    raise TypeError ("Type %s not serializable" % type(obj))

conn = MySQLdb.connect(instance)
curr = conn.cursor()
curr.execute("SELECT * FROM `assets`")
data = curr.fetchall()
print json.dumps(data, default=json_serial)

سيعود تفريغ json

هناك طريقة أكثر بساطة بدون مقالب json ، هنا احصل على رأس واستخدم الرمز البريدي لتعيين كل منها في النهاية تم إنشاؤه كـ json ولكن هذا لا يغير وقت التشغيل إلى json serializer ...

data_json = []
header = [i[0] for i in curr.description]
data = curr.fetchall()
for i in data:
    data_json.append(dict(zip(header, i)))
print data_json

ألعب مع تطبيق ويب صغير في web.py ، وأعد عنوان url لإرجاع كائن JSON. ما هي أفضل طريقة لتحويل جدول SQL إلى JSON باستخدام بيثون؟


أنا شخصياً أفضل استخدام SQLObject لهذا النوع من الأشياء. لقد قمت بتكييف رمز اختبار سريع وقذر كان علي الحصول عليه:

import simplejson

from sqlobject import *

# Replace this with the URI for your actual database
connection = connectionForURI('sqlite:/:memory:')
sqlhub.processConnection = connection

# This defines the columns for your database table. See SQLObject docs for how it
# does its conversions for class attributes <-> database columns (underscores to camel
# case, generally)

class Song(SQLObject):

    name = StringCol()
    artist = StringCol()
    album = StringCol()

# Create fake data for demo - this is not needed for the real thing
def MakeFakeDB():
    Song.createTable()
    s1 = Song(name="B Song",
              artist="Artist1",
              album="Album1")
    s2 = Song(name="A Song",
              artist="Artist2",
              album="Album2")

def Main():
    # This is an iterable, not a list
    all_songs = Song.select().orderBy(Song.q.name)

    songs_as_dict = []

    for song in all_songs:
        song_as_dict = {
            'name' : song.name,
            'artist' : song.artist,
            'album' : song.album}
        songs_as_dict.append(song_as_dict)

    print simplejson.dumps(songs_as_dict)


if __name__ == "__main__":
    MakeFakeDB()
    Main()

إذا كنت تستخدم خادم MSSQL Server 2008 وما فوق ، فيمكنك اختيار إجراء SELECT الخاص بك للعودة json باستخدام جملة FOR JSON AUTO EG

SELECT name, surname FROM users FOR JSON AUTO

سيعود جسون كما

[{"name": "John" }, {"name": "Jane","surname": "Doe" }, {"name": "Foo","surname": "Samantha" }]


طرقت نصًا قصيرًا يفرغ كل البيانات من جميع الجداول ، مثل مخططات اسم العمود: القيمة. بخلاف الحلول الأخرى ، فإنه لا يتطلب أي معلومات حول ماهية الجداول أو الأعمدة ، إنه يبحث عن كل شيء ويقوم بتفريغه. أملي أن يجد أنه من المفيد!

from contextlib import closing
from datetime import datetime
import json
import MySQLdb
DB_NAME = 'x'
DB_USER = 'y'
DB_PASS = 'z'

def get_tables(cursor):
    cursor.execute('SHOW tables')
    return [r[0] for r in cursor.fetchall()] 

def get_rows_as_dicts(cursor, table):
    cursor.execute('select * from {}'.format(table))
    columns = [d[0] for d in cursor.description]
    return [dict(zip(columns, row)) for row in cursor.fetchall()]

def dump_date(thing):
    if isinstance(thing, datetime):
        return thing.isoformat()
    return str(thing)


with closing(MySQLdb.connect(user=DB_USER, passwd=DB_PASS, db=DB_NAME)) as conn, closing(conn.cursor()) as cursor:
    dump = {}
    for table in get_tables(cursor):
        dump[table] = get_rows_as_dicts(cursor, table)
    print(json.dumps(dump, default=dump_date, indent=2))

مزيد من المعلومات حول كيف ستعمل مع بياناتك قبل نقلها سيساعد للطن. توفر الوحدة النمطية json طرق التفريغ والتحميل التي ستساعد إذا كنت تستخدم 2.6 أو أحدث: http://docs.python.org/library/json.html .

- تحرير -

دون معرفة المكتبات التي تستخدمها ، لا يمكنني أن أخبرك على وجه اليقين ما إذا كنت ستجد طريقة من هذا القبيل. عادةً ، سأقوم بمعالجة نتائج الاستعلام مثل هذا (أمثلة مع kinterbasdb لأنه ما نعمل عليه حاليًا):

qry = "Select Id, Name, Artist, Album From MP3s Order By Name, Artist"
# Assumes conn is a database connection.
cursor = conn.cursor()
cursor.execute(qry)
rows = [x for x in cursor]
cols = [x[0] for x in cursor.description]
songs = []
for row in rows:
  song = {}
  for prop, val in zip(cols, row):
    song[prop] = val
  songs.append(song)
# Create a string representation of your array of songs.
songsJSON = json.dumps(songs)

هناك بلا شك أفضل من الخبراء الذين سيكون لديهم فهم بالقوائم للتخلص من الحاجة إلى حلقات مكتوبة ، ولكن هذا يجب أن يكون شيئًا يمكن أن تتكيف معه مع أي مكتبة تسترجع السجلات معها.


يبدو أن لا أحد قدم خيار الحصول على JSON مباشرة من خادم Postgresql ، باستخدام قدرة postgres JSON https://www.postgresql.org/docs/9.4/static/functions-json.html

لا يوجد تحليل أو حلقات أو أي استهلاك للذاكرة على جانب الثعبان ، والذي قد ترغب حقًا في التفكير فيه إذا كنت تتعامل مع 100000 أو ملايين الصفوف.

from django.db import connection

sql = 'SELECT to_json(result) FROM (SELECT * FROM TABLE table) result)'
with connection.cursor() as cursor:
  cursor.execute(sql)
  output = cursor.fetchall()

طاولة مثل:

id, value
----------
1     3
2     7

سيعود كائن Python JSON

[{"id": 1, "value": 3},{"id":2, "value": 7}]

ثم استخدم json.dumps لتفريغ كسلسلة JSON







json