pythonフレームワークのFlask基礎編(二)------データベースの操作
21823 ワード
1.flask接続データベースの4つのステップ:サードパーティ製データベース拡張パッケージへの移行:from flask_sqlalchemy import SQLAlchemy configプロパティを構成し、データベースに接続する:app.config["SQLALCHEMY_DATABASE_URI"] = "mysql://root:mysql@localhost/first_flask"app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False データベースfirst_の作成flask 操作データベースオブジェクトの作成:db=SQLAlchemy(app) コードの説明を直接行います.
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
次のバグを挿入します.
テーブルの作成が完了すると、次の2つの文に注意します.
テーブルにデータを挿入すると、次のようなエラーが発生します.
sqlalchemy.exc.IntegrityError: (_mysql_exceptions.IntegrityError) (1062, "Duplicate entry 'admin' for key 'name'") [SQL: u'INSERT INTO roles (name) VALUES (%s)'] [parameters: ('admin',)]
ネット上の多くの資料を調べて、フィールドの制約unique=Trueを外せばいいと言っていますが、根本的な原因はここではありません.
なぜならapp.run(debug=True).Debugモードをオンにすると、コードを変更すると、テーブルの削除やテーブルの作成などの2つのコメントが表示され、データを挿入するコメントが表示されます.このプロシージャdebugモードのデフォルトでは、プログラムが実行されます.データベースにはすでにデータがあり、再び手動で実行すると、データベースにデータが挿入され、エラーが表示されます.フィールドの制約は一意性のuniqueであるため、解決策は2つあります.
1つ目は、テーブルの削除とテーブルの作成という2つの文のコメントをしないで、実行するたびに2つの文を持っていくことです.Debugモードで自動的に実行しても、手動でプログラムを実行しても、テーブルを削除してからテーブルを作成するので、何度実行しても怖くありません.
2つ目は、debugモードをオフにします.そうですrun()
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2.データベースの追加削除:
1.次の方法は、新しいクエリーを返し、エフェクタと組み合わせて使用する必要があります.
filter():フィルタリングで、機能が強い.filter_by():フィルタリングは、比較的簡単なフィルタリングシーンで使用されます.
order_by():並べ替え.デフォルトは昇順で、降順にはパケットが必要です:from sqlalchemy import*.次にdescメソッドを導入する.例えばorder_by(desc("email")).メールボックスのアルファベットの降順に並べ替えます.
group_by():グループ化します.
2.以下は、上のフィルタに合わせて使用する一般的なアクチュエータです.
get():idが数に等しい関数を取得します.たとえば、id=1のオブジェクトをクエリーします.get(1).カッコに「id=」はなく、idの数値に直接入力するとokになります.この関数の機能は、プライマリ・キーが数に等しいオブジェクトをクエリーすることです.
all():すべてのデータをクエリーします.
first():最初のデータをクエリーします.
count():クエリー結果の数を返します.
paginate():ページングクエリーで、ページングオブジェクトを返します.paginate(パラメータ1,パラメータ2,パラメータ3)
パラメータ1:現在は何ページ目ですか.パラメータ2:各ページにいくつかのレコードが表示されます.パラメータ3:エラーを返すかどうか.
返されるページング・オブジェクトには、3つのプロパティがあります.items:クエリーの結果を取得し、pages:合計何ページを取得し、page:現在のページを取得します.
3.一般的な論理子:
バッグを入れる必要があるのは、from sqlalchemy import*
not_ and_ or_上に述べたソートdescもあります.
よく使われる内蔵:in_フィールドがどの範囲にあるかを示します.
4.その他の関係のデータベース・クエリー:
endswith():何で終わりますか.
startswith():何で始まりますか.
contains():含む
5.次は上記の使い方を体得します.
3.サードパーティ拡張フレームワークを使用してデータベースファイルを移行します.
フレームワークを使用して構成するコードは次のとおりです.
移行コマンドを使用すると、次のようになります.
例えば、上記のコードが存在するファイル名はdatabaseである.py.
1.python database.py db init移行ファイルを管理するmigrationsディレクトリを生成
2.python database.py db migrate-m「コメント」は、データテーブルの作成と更新の異なるバージョンのコードを記録するmigrations/versionsでファイルを生成します.
3.python database.py db upgradeは、データベースに対応するテーブルを生成します.
4.表を変更する必要がある場合は、変更が終わったら、まず第2ステップを実行し、それから第3ステップを実行します.
5.データテーブルのバージョン番号を変更する必要がある場合は、次の操作を行います.
python database.py db upgradeバージョン番号アップバージョン番号アップ
python database.py db downgradeバージョン番号下向きにバージョン番号を変更
使用可能な他の文:
python database.py db history履歴バージョン番号の表示
python database.py db current現在のバージョン番号の表示
転載先:https://www.cnblogs.com/RomanticLife/p/8372624.html
# -*- coding:utf-8 -*-
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
# url : :// : @ip : ( )/
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql://root:mysql@localhost/first_flask"
# . . .
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
#
db = SQLAlchemy(app)
class Role(db.Model):
__tablename__ = "roles"
id = db.Column(db.Integer,primary_key=True)
name = db.Column(db.String(16),unique=True)
# Role uses , users 。
# backref User role , roles 。 flask 。
users = db.relationship('User',backref="role")
# __str__ 。
def __repr__(self):
return "Role: %s %s" % (self.id,self.name)
class User(db.Model):
# , , user。
__tablename__ = "users"
id = db.Column(db.Integer,primary_key=True)
name = db.Column(db.String(16),unique=True)
email = db.Column(db.String(32),unique=True)
password = db.Column(db.String(16))
# , django 。flask ,
role_id = db.Column(db.Integer,db.ForeignKey("roles.id"))
def __repr__(self):
return "User: %s %s %s %s" % (self.id,self.name,self.password,self.role_id)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
#
db.drop_all()
#
db.create_all()
ro1 = Role(name = "admin")
# ro1 , 。
db.session.add(ro1)
ro2 = Role()
ro2.name = 'user'
db.session.add(ro2)
#
db.session.commit()
us1 = User(name='wang', email='[email protected]', password='123456', role_id=ro1.id)
us2 = User(name='zhang', email='[email protected]', password='201512', role_id=ro2.id)
us3 = User(name='chen', email='[email protected]', password='987654', role_id=ro2.id)
us4 = User(name='zhou', email='[email protected]', password='456789', role_id=ro1.id)
us5 = User(name='tang', email='[email protected]', password='158104', role_id=ro2.id)
us6 = User(name='wu', email='[email protected]', password='5623514', role_id=ro2.id)
us7 = User(name='qian', email='[email protected]', password='1543567', role_id=ro1.id)
us8 = User(name='liu', email='[email protected]', password='867322', role_id=ro1.id)
us9 = User(name='li', email='[email protected]', password='4526342', role_id=ro2.id)
us10 = User(name='sun', email='[email protected]', password='235523', role_id=ro2.id)
db.session.add_all([us1, us2, us3, us4, us5, us6, us7, us8, us9, us10])
db.session.commit()
app.run(debug=True)
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
次のバグを挿入します.
テーブルの作成が完了すると、次の2つの文に注意します.
#
db.drop_all()
#
db.create_all()
テーブルにデータを挿入すると、次のようなエラーが発生します.
sqlalchemy.exc.IntegrityError: (_mysql_exceptions.IntegrityError) (1062, "Duplicate entry 'admin' for key 'name'") [SQL: u'INSERT INTO roles (name) VALUES (%s)'] [parameters: ('admin',)]
ネット上の多くの資料を調べて、フィールドの制約unique=Trueを外せばいいと言っていますが、根本的な原因はここではありません.
なぜならapp.run(debug=True).Debugモードをオンにすると、コードを変更すると、テーブルの削除やテーブルの作成などの2つのコメントが表示され、データを挿入するコメントが表示されます.このプロシージャdebugモードのデフォルトでは、プログラムが実行されます.データベースにはすでにデータがあり、再び手動で実行すると、データベースにデータが挿入され、エラーが表示されます.フィールドの制約は一意性のuniqueであるため、解決策は2つあります.
1つ目は、テーブルの削除とテーブルの作成という2つの文のコメントをしないで、実行するたびに2つの文を持っていくことです.Debugモードで自動的に実行しても、手動でプログラムを実行しても、テーブルを削除してからテーブルを作成するので、何度実行しても怖くありません.
2つ目は、debugモードをオフにします.そうですrun()
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2.データベースの追加削除:
1.次の方法は、新しいクエリーを返し、エフェクタと組み合わせて使用する必要があります.
filter():フィルタリングで、機能が強い.filter_by():フィルタリングは、比較的簡単なフィルタリングシーンで使用されます.
order_by():並べ替え.デフォルトは昇順で、降順にはパケットが必要です:from sqlalchemy import*.次にdescメソッドを導入する.例えばorder_by(desc("email")).メールボックスのアルファベットの降順に並べ替えます.
group_by():グループ化します.
2.以下は、上のフィルタに合わせて使用する一般的なアクチュエータです.
get():idが数に等しい関数を取得します.たとえば、id=1のオブジェクトをクエリーします.get(1).カッコに「id=」はなく、idの数値に直接入力するとokになります.この関数の機能は、プライマリ・キーが数に等しいオブジェクトをクエリーすることです.
all():すべてのデータをクエリーします.
first():最初のデータをクエリーします.
count():クエリー結果の数を返します.
paginate():ページングクエリーで、ページングオブジェクトを返します.paginate(パラメータ1,パラメータ2,パラメータ3)
パラメータ1:現在は何ページ目ですか.パラメータ2:各ページにいくつかのレコードが表示されます.パラメータ3:エラーを返すかどうか.
返されるページング・オブジェクトには、3つのプロパティがあります.items:クエリーの結果を取得し、pages:合計何ページを取得し、page:現在のページを取得します.
3.一般的な論理子:
バッグを入れる必要があるのは、from sqlalchemy import*
not_ and_ or_上に述べたソートdescもあります.
よく使われる内蔵:in_フィールドがどの範囲にあるかを示します.
4.その他の関係のデータベース・クエリー:
endswith():何で終わりますか.
startswith():何で始まりますか.
contains():含む
5.次は上記の使い方を体得します.
1.
User.query.all()
2.
User.query.count()
3. 1
User.query.first()
4. id 4 [3 ]
User.query.get(4)
User.query.filter_by(id=4).first()
User.query.filter(User.id==4).first()
filter:( . ==)
filter_by:( =)
filter_by: ,
filter filter_by , , or_、in_ 。
5. g [ / ]
User.query.filter(User.name.endswith('g')).all()
User.query.filter(User.name.contains('g')).all()
6. wang [2 ]
from sqlalchemy import not_
: : _( )
User.query.filter(not_(User.name=='wang')).all()
User.query.filter(User.name!='wang').all()
7. li [2 ]
from sqlalchemy import and_
User.query.filter(and_(User.name.startswith('li'), User.email.startswith('li'))).all()
User.query.filter(User.name.startswith('li'), User.email.startswith('li')).all()
8. password `123456` `email` `itheima.com`
from sqlalchemy import or_
User.query.filter(or_(User.password=='123456', User.email.endswith('itheima.com'))).all()
9. id [1, 3, 5, 7, 9]
User.query.filter(User.id.in_([1, 3, 5, 7, 9])).all()
10. name liu
User.query.filter_by(name='liu').first().role.name
11. ,
User.query.order_by('email').all()
User.query.order_by(desc('email')).all()
12. 2 , 3
help(User.query.paginate)
: 1. 2. 3.
pages = User.query.paginate(2, 3, False)
pages.items #
pages.pages #
pages.page #
3.サードパーティ拡張フレームワークを使用してデータベースファイルを移行します.
フレームワークを使用して構成するコードは次のとおりです.
# -*- coding:utf-8 -*-
from flask import Flask
from flask_sqlalchemy import SQLAlchemy #
from flask_script import Manager #
from flask_migrate import Migrate,MigrateCommand #
app = Flask(__name__)
app.debug = True
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql://root:mysql@localhost/second_flask"
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
db = SQLAlchemy(app)
manager = Manager(app)
#
migrate = Migrate(app,db)
# ‘db’
manager.add_command('db',MigrateCommand)
class Role(db.Model):
__tablename__ = "table_roles"
id = db.Column(db.Integer,primary_key=True)
name = db.Column(db.String(16),unique=True)
info = db.Column(db.String(100))
Users = db.relationship("User",backref='role')
class User(db.Model):
__tablename__ = "table_users"
id = db.Column(db.Integer,primary_key=True)
name = db.Column(db.String(16),unique=True)
info = db.Column(db.String(200))
role_id = db.Column(db.Integer,db.ForeignKey("table_roles.id"))
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
manager.run()
移行コマンドを使用すると、次のようになります.
例えば、上記のコードが存在するファイル名はdatabaseである.py.
1.python database.py db init移行ファイルを管理するmigrationsディレクトリを生成
2.python database.py db migrate-m「コメント」は、データテーブルの作成と更新の異なるバージョンのコードを記録するmigrations/versionsでファイルを生成します.
3.python database.py db upgradeは、データベースに対応するテーブルを生成します.
4.表を変更する必要がある場合は、変更が終わったら、まず第2ステップを実行し、それから第3ステップを実行します.
5.データテーブルのバージョン番号を変更する必要がある場合は、次の操作を行います.
python database.py db upgradeバージョン番号アップバージョン番号アップ
python database.py db downgradeバージョン番号下向きにバージョン番号を変更
使用可能な他の文:
python database.py db history履歴バージョン番号の表示
python database.py db current現在のバージョン番号の表示
転載先:https://www.cnblogs.com/RomanticLife/p/8372624.html