Я новичок в базах данных. У меня есть база данных SQLite, которую необходимо преобразовать в SQLAlchemy, чтобы она принадлежала Postgres.
Это часто происходит, когда у вас есть база данных файловой системы, которую нужно перевести в рабочую среду, и вы живете в кластерной среде, такой как Docker Swarm, где данные должны быть разделены между контейнерами. Я полагаю, что SQLite не предназначен для этого.
Я искал способы перевода из синтаксиса SQLite в SQAlchemy, но все, что я нахожу, касается миграций. Мне это не нужно. Мне нужно провести рефакторинг кода и понять различия синтаксиса в отношении:
- создание таблиц
- вставка данных
- взаимосвязи между таблицами.
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 выше?