Sqlite перевод на Flask -SQAlchemy - PullRequest
0 голосов
/ 18 февраля 2020

Я новичок в базах данных. У меня есть база данных SQLite, которую необходимо преобразовать в SQLAlchemy, чтобы она принадлежала Postgres.

Это часто происходит, когда у вас есть база данных файловой системы, которую нужно перевести в рабочую среду, и вы живете в кластерной среде, такой как Docker Swarm, где данные должны быть разделены между контейнерами. Я полагаю, что SQLite не предназначен для этого.

Я искал способы перевода из синтаксиса SQLite в SQAlchemy, но все, что я нахожу, касается миграций. Мне это не нужно. Мне нужно провести рефакторинг кода и понять различия синтаксиса в отношении:

  1. создание таблиц
  2. вставка данных
  3. взаимосвязи между таблицами.

SQLite

Это мой код для создания таблиц SQLite и их индексов, а также один пример, который выполняет операции с таблицами и создает связи между ними.

class crawler:
    # Initialize the crawler with the name of database
    def __init__(self, dbname):
        self.con = sqlite3.connect(
            dbname, 
            timeout=10)

    def __del__(self):
        self.con.close()

    def dbcommit(self):
        self.con.commit()

# Create the database tables
def create_index_tables(self):

    self.con.execute('create table urllist(url)')
    self.con.execute('create table wordlist(word)')
    self.con.execute('create table wordlocation(urlid,wordid,location)')
    self.con.execute('create table link(fromid integer,toid integer)')
    self.con.execute('create table linkwords(wordid,linkid)')
    self.con.execute('create index wordidx on wordlist(word)')
    self.con.execute('create index urlidx on urllist(url)')
    self.con.execute('create index wordurlidx on wordlocation(wordid)')
    self.con.execute('create index urltoidx on link(toid)') 
    self.con.execute('create index urlfromidx on link(fromid)') 
    self.dbcommit()


def calculate_pagerank(self,iterations=20):

    # clear out the current PageRank tables
    self.con.execute('drop table if exists pagerank')
    self.con.execute('create table pagerank(urlid primary key,score)')
    # initialize every url with a PageRank of 1
    self.con.execute('insert into pagerank select rowid, 1.0 from urllist') 
    self.dbcommit( )

    for i in range(iterations):
        print ("Iteration %d" % (i))
        for (urlid,) in self.con.execute('select rowid from urllist'):
            pr=0.15
            # Loop through all the pages that link to this one
            for (linker,) in self.con.execute(
            'select distinct fromid from link where toid=%d' % urlid):
                # Get the PageRank of the linker
                linkingpr=self.con.execute(
                'select score from pagerank where urlid=%d' % linker).fetchone()[0]         
                # Get the total number of links from the linker 
                linkingcount=self.con.execute(
                'select count(*) from link where fromid=%d' % linker).fetchone()[0] 
                pr+=0.85*(linkingpr/linkingcount)
            self.con.execute(
        'update pagerank set score=%f where urlid=%d' % (pr,urlid)) 
        self.dbcommit( )

тогда я бы:

crawler=crawler('searchindex.db')

crawler.create_index_tables() #DONE once

crawler.calculate_pagerank()

cur = crawler.con.execute('select * from pagerank order by score desc')

print ([row for row in crawler.con.execute(
    'select rowid from wordlocation where wordid=10')])

и т. д.


SQALChemy

И вот как я строю свои модели SQAlchemy (не связанные с моими таблицами SQLite выше ), с примером отношений. Эта модель уже принадлежит Postgres.

class User(db.Model):

    __tablename__ = 'users'
    __bind_key__ = 'db1'

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    username = db.Column(db.String(128), unique=True)
    email = db.Column(db.String(128), unique=True)

    menu = db.relationship("Menu",
                    backref=db.backref('user'), 
                    uselist=True)

    def __init__(self, username, email):
        self.username = username
        self.email = email

    def __repr__(self):
     return '<ID %r>, <Coffeeshop %r>, <Username %r>' % (self.id,
                                                         self.username)

    def serialize(self):
       return { 
        'id': self.id,
        'username': self.username,
        'email': self.email,
        'menu' : [ item.serialize() for item in self.menu],
        }

, с этой моделью вы можете просто добавить:

db.session.add(User(
            username=username, 
            email=email, 
            password=password))
db.session.commit()

query:

users = User.query.all()

serialize:

[user.serialize() for user in User.query.all()]

Моя цель - провести рефакторинг моей прежней базы данных SQLite с использованием этой последней модели SQAlchemy для таблиц.

Что меня больше всего смущает, так это необходимость объявления индексов для таблиц в SQLite, и как это нужно преобразовать в SQAlchemy.

Может кто-нибудь указать мне правильное направление, начиная с моего кода SQLite выше?

...