from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
app = Flask(__name__)
HOSTNAME = '127.0.0.1'
PORT = '3306'
DATABASE = 'xxxxx'
USERNAME = 'root'
PASSWORD = 'xxxxx'
DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(USERNAME,PASSWORD,HOSTNAME,PORT,DATABASE)
app.config['SQLALCHEMY_DATABASE_URI']=DB_URI
db = SQLAlchemy(app)
migrate=Migrate(app,db)
#定义orm模型
class User(db.Model):
__tablename__ = "user"
id = db.Column(db.Integer, primary_key=True, autoincrement=True) # 主键和自增
username=db.Column(db.String(200),nullable=False)
#与user是一对一的关系
class UserExtension(db.Model):
__tablename__ = "user_extension"
id = db.Column(db.Integer, primary_key=True, autoincrement=True) # 主键和自增
school=db.Column(db.String(100))
user_id=db.Column(db.Integer,db.ForeignKey("user.id"))
#1在反向引用的时候,如果需要传递一些其他的参数,那么就需要这个函数,否则不需要使用,只要在
#relationship的backref上,设置反向引用的名称就可以了
#2userlist=false:代表反向引用的时候,不是一个列表,而是一个对象
user=db.relationship("User",backref=db.backref("extension",uselist=False))
class Article(db.Model):
__tablename__="article"
id =db.Column(db.Integer,primary_key=True,autoincrement=True)#主键和自增
title=db.Column(db.String(200),nullable=False)#是否为空
content=db.Column(db.Text,nullable=False)
#外键:1外键的数据类型要看引用位置的数据类型
#2,外键一定是通过db.Foreignkey(xxx)
#3.外键是属于数据库层面的,不推荐直接在orm中使用
author_id=db.Column(db.Integer,db.ForeignKey("user.id"))
#用relationship
#第一个参数是模型的名字
#第二个参数是backref(back reference):代表反向引用,代表对方访问我的时候的字段名称
author=db.relationship("User",backref="articles")#user与外键所处的数据库名一致,backref反向引用
#创建表,暂时没有orm数据库的迁移,所以只能先删除所有的表,再创建
# db.drop_all()
# db.create_all()
@app.route("/1-1n")
def one_to_many():
article=Article(title="111",content="xxx")
user=User(username="ljy")
article.author=user
db.session.add(article)
db.session.commit()
print(user.articles)#backref访问作文的文章
return "1-1ok"
@app.route("/1-1")
def one_to_one():
user=User(username="ljy1")
extension=UserExtension(school="温州医科")
user.extension=extension
db.session.add(user)
db.session.commit()
return "one=to=one"
@app.route("/article")
def article_view():
# #1.添加数据
# #insert table article values(xx)
# article=Article(title="钢铁是怎样炼成的",content="保尔")
# db.session.add(article)
# #做一个提交操作
# db.session.commit()
# #2查询数据
# #filter_by:返回一个类列表的对象,取零操作和操作列表一样
# article=Article.query.filter_by(id=1)[0]
# print(article.title)
#3修改数据
# article = Article.query.filter_by(id=1)[0]
# article.content="yyy"
# db.session.commit()
# print(article.content)
#4 删除数据
# Article.query.filter_by(id=2).delete()
# db.session.commit()
return "数据操作成功"
@app.route('/')
def hello_world():
#验证是否成功
engine=db.get_engine()
with engine.connect() as conn:
result=conn.execute("select 1")
print(result.fetchone())
return 'Hello World!'
if __name__ == '__main__':
app.run()