2015-03-16 2 views
0

Я использую PostGreSQL с sqlalchemy. Я относительно новичок в отношении баз данных и совершенно новый для sqlalchemy. В настоящее время у меня есть простая база данных, содержащая столбцы для githash (первичный ключ), коммиттер и дата.sqlalchemy - данные не сохраняются в базе данных с session.commit()

У меня есть файл JSON, который собирает данные, и моя главная цель - перенести все данные из файла в базу данных (и все новые данные также будут помещены в базу данных). Сценарий python, который я написал, позволяет использовать аргумент (-j) и путь к файлу json, который должен быть добавлен в базу данных; однако это не требуется, поскольку, как только данные находятся в базе данных, я хочу получить данные из базы данных без указания файла JSON.

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

python PostGreSQLTest.py -j JSONFile.json 
1012 

1012 строки будут добавлены, а затем впоследствии извлекается из базы данных, а также графический интерфейс базы данных отражает это, как хорошо.

Когда сразу послесловие, я называю сценарий без файла JSON, и попытаться получить количество строк из базы данных, он показывает 0 строк (как в качестве выхода из сценария, так и в графическом интерфейсе.)

python PostGreSQLTest.py 
0 

Кажется, что данные не сохраняются в базе данных между сеансами, хотя я вызываю session.commit(). Я включил образец кода ниже. Любое понимание этого вопроса было бы высоко оценено.

from argparse import ArgumentParser 
import json 
import os 

from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy import Column, Text, Integer, Date, create_engine, ForeignKey 
from sqlalchemy.orm import scoped_session, sessionmaker 

Base = declarative_base() 
session = scoped_session(sessionmaker()) 

class TestRecord(Base): 
    __tablename__ = 'test_table' 
    githash = Column(Text, primary_key=True) 
    committer = Column(Text) 
    date = Column(Date) 

class TestDatabase(object): 
    ''' 
    classdocs 
    ''' 
    def __init__(self): 
     ''' 
     Constructor 
     ''' 
     self.db_name = "test_db" 
     self.user = "un" 
     self.pw = "pw" 
     engine = self.__init_db() 

    '''Initializers'''  
    def __init_db(self): 
     engine_string = 'postgresql://{0}:{1}@localhost/{2}'.format(self.user, self.pw, self.db_name) 
     engine = create_engine(engine_string, echo=False) 
     session.remove() 
     session.configure(bind=engine, autoflush=False, expire_on_commit=False) 
     Base.metadata.drop_all(engine) 
     Base.metadata.create_all(engine) 
     return engine 

    def __grab_json_file(self, filename): 
     jsonFile = open(filename, 'rb') 
     J = json.load(jsonFile) 
     jsonFile.close() 
     return J 

    '''Helper Functions''' 

    '''Main Functions''' 
    def add_entries_from_JSON(self, filename): 
     ''' 
     Add Entries From JSON reads in a JSON file and creates records in the database. 
     :param filename: <String> Full path to the JSON File 
     :return success: <bool> True if records are successfully written, False otherwise 
     ''' 
     TR_entries = [] 
     success = False 
     if os.path.isfile(filename): 
      # If the JSON file exists, open it and create records 
      entries = self.__grab_json_file(filename) 
      for key in entries.keys(): 
       TR = TestRecord() 
       TR.githash = entries[key]["gitHash"] 
       TR.date = entries[key]["Date"] 
       TR.committer = entries[key]["Committer"]  
       TR_entries.append(TR) 
      # Add all records from the list of TestRecord objects to the database 
      success = self.add_multiple_entries(TR_entries) 
     else: 
      print "JSON file '{0}' provided does not exist.".format(filename) 
     return success  

    def add_multiple_entries(self, entries): 
     ''' 
     Add multiple entries adds multiple entries to the database. 
     :param entries: <list of TestRecord> list of records to add to the database 
     :return success: <bool> True if successfully added, false otherwise 
     ''' 
     success = True 
     try: 
      session.add_all(entries) 
      session.commit() 
     except: 
      success = False 
      raise 
     return success 

    def get_num_rows(self): 
     ''' 
     Get the number of rows in the database. 
     :return numRows: the number of rows in the database 
     ''' 
     numRows = session.query(TestRecord).count() 
     return numRows 


    def cleanup(self): 
     ''' 
     Cleanup wraps everything up. 
     ''' 
     session.close() 

def main (jsonFile=None): 
    TD = TestDatabase() 
    if jsonFile is not None: 
     if TD.add_entries_from_JSON(jsonFile) is False: 
      print "Failed to add entries from JSON File '{0}'.".format(jsonFile) 
    rows = TD.get_num_rows() 
    print rows 
    TD.cleanup() 


def argparser(): 
    argparser = ArgumentParser(description = 'PostGreSQL Database operations.') 
    argparser.add_argument('-j', 
          '--jsonFile', 
          help='Full file path to a JSON file containing databse entries.', 
          required = False 
          ) 
    return argparser 

if __name__ == "__main__": 
    args = argparser().parse_args() 
    main(args.jsonFile) 

ответ

0

данные не сохраняющиеся в базе данных между сеансами,

э-э ... вы имеете в виду, что у вас нет данных между отдельными вызовами вашего сценария? Это следует ожидать, когда вы бросаете все столы:

def __init_db(self): 
    # ... snip ... 
    Base.metadata.drop_all(engine) 
    #    ^^^^^^^^ 
    Base.metadata.create_all(engine) 

Избавьтесь от этой линии. что он должен делать, если не «бросить все!»

+0

Большое вам спасибо. Я полностью замалчиваю это - оцените помощь! – user2063496

Смежные вопросы